まつもと ゆきひろです

In message "[ruby-list:19967] Re: メソッド名の制限?"
    on 99/12/29, "Hideaki Takata" <hideakit / d3.dion.ne.jp> writes:
|
|> ぼくはそう見えるのはそう作るのが好きです。そのまま作れないと
|> きはなんとかごまかすけど ^^;;
|
|おっしゃることは、まったくそのとおりだと思うんですが。
|生意気にも反論させていただきますと、
|僕は「クラスを作る時にありがたい書き方」と、
|「クラスを使うだけの時に楽な書き方」は違うような気がするんです。
|
|他の言語の話で恐縮ですが、たとえば、
|Javaで作ったクラスをJavaScriptから使う時、
|objectName.foo = barとかbar = objectName.fooなんて書くと
|それぞれ、objectName.setFoo(bar)とbar = objectName.getFoo
|というJavaのコードと同じことをする訳で、
|これは、JavaScriptのターゲットである
|「既存のクラスを使うだけでいい仕事」には楽な書き方ですし

ま、これは Ruby の attr と同じですよね。
ここまでは問題なし、と。

|で、Rubyのobject.method=とかobject.[]=なんてメソッドは
|少なくとも僕にとっては、
|両方のニーズを単一の言語でシンプルに実現している気がして
|うれしいのです。

同意します。それがやりたかったんですから。
# それだけじゃないけど。

しかし、じゃあそれらが嬉しいから

  object.method[arg]

とか

  object.method[arg] = val

を method[] とか method[]= とかいうひとつにまとめて良いもの
かというと、相当躊躇するわけです。

というのも、method= も []= もある現状に method[]= を追加する
ということは

  object.method[arg] = val

というプログラムを見たとき

  * objectのmethodの実行結果に[]=を適用しているのか
  * objectのmethod[]=を実行しているのか

区別つかなくなりません? あるいはobjectにmethodやmethod[]=が
定義されているのかどうかで決まればよいと考えるかもしれません
が、実は私のポリシーとしてプログラムの意味はできるだけ静的に
決まるべきだと考えているので、メソッドがあるかないかで意味が
変わるような仕様はあまり望ましくないと考えているのです。

前述の

  object.method(arg) = val

の方にはそのような問題はないですが、今度はインタプリタの実装
が複雑になるので躊躇しているのです。

|クラス使用者が気にしないでも自動的にそれをやってくれて、しかも
|クラスを使ってる人は@zairyouだけを扱うことだけを気にしていればよい
|という状況がありがたいかなと思っただけです。

ま、ありがたくないとはいいませんが、早晩破綻しそう。一種の
active valueだと思えば良いのかな。でも active value を実現す
るクラスライブラリを作った方が早いかも。そうすれば、

|# 本格的にそうしたいんなら、@zairyouにRecipeの参照を持たせて、
|# 特異メソッドでRecipeに変更をお知らせしたほうがいいのでしょうが
|# ここでは、そこまで大掛かりなことをしないという前提の話です。

という「大掛かりなこと」をユーザの目には簡単に提供できるかも。

                                まつもと ゆきひろ /:|)