まつもと ゆきひろです

In message "[ruby-dev:7703] Re: new syntax (Re: Re: Ruby 2.0       の話題解禁)"
    on 99/08/17, 石塚圭樹 <keiju / Rational.Com> writes:

|>|今、method=というメソッドは「obj.method = val」という形で呼び出せるのに
|>|
|>|「obj.method(arg1, arg2...) = val」というシンタックスは許されて
|>|
|>|いないのですね。これを許すようにはできませんか?
|>
|>えーと、以前そうしようと思った記憶があるのに、現在そうなって
|>ないところを見ると、なにか難しい問題があるんでしょうね。
|>ま、でも、この機会に再検討してみましょう。
|
|あまり反対はないんですが 元々の Rubyの代入の考え方とずれが大きくなってい
|るのが気になりますよね...

そーですかねえ。もちろん、変数への代入は統一的なモデルがある
わけですが、そうでないものは結局はメソッド呼び出しであると明
言しているわけですから、ずれとは言わないんじゃないかと私は思
います。

|C++なら,
|
|  var = val
|  obj.foo(...) = val
|
|はどっちも同じ意味ですが, Ruby の
|
|  var = val
|
|
|
|  obj.foo = val
|
|はだいぶ意味が違いますよね. 変数の代入とメソッド呼び出ですので. 

まったくその通りです。

|でも, メソッドにパラメータが付くと, よく意味が...
|
|  obj.foo(...) = val
|
|これはどういう意味なんだろう? って気になりせん? この場合対応する変数
|obj.foo(...)って存在しませんし... どういったときに使うといった用法的な意
|味付けも結構曖昧になりそうだと思うのですが.... 

もともと obj.foo = val は「objのfooという属性をvalにする」と
いう仮想的な意味なわけですから、obj.foo(a)=valは「objの
foo(a)という属性をvalにする」という意味がとれる文脈でならば
問題ない使い方でしょうし(C++でリファレンスを返すようなコンテ
キスト)、逆にそういう意味にとれない場合に使うのははっきり言っ
て乱用でしょう。しかし、乱用される可能性があるからという理由
では禁止する必要はないと思います。

とはいえ、採用する前にもうちょっと考えた方が良いような予感が
しているのも確かなんですが。

|ちなみにRubyのビルトインメソッドで使えそうなのは.
|
|  array.indexes(...)= [...]
|  array.fill(start = nil, last = nil) = val
|  hash.indexes(...)= [...]
|  string.gsub(search) = replace
|  string.gsub!(search) = replace
|  string.sub(search) = replace
|  string.tr(search) = replace
|  string.tr!(search) = replace
|
|ぐらいですかね. ただ, メソッドの戻り値が違って来ると思いますが.

そうですねえ。でも、これらはやっぱり「使いすぎ」のような気が
します。
                                まつもと ゆきひろ /:|)