けいじゅ@日本ラショナルソフトウェアです.

In [ruby-dev :7707 ] the message: "[ruby-dev:7707] Re: new syntax (Re:
Re: Ruby 2.0 の話題解禁) ", on Aug/18 01:34(JST) Yukihiro Matsumoto
writes:

>まつもと ゆきひろです

>|あまり反対はないんですが 元々の Rubyの代入の考え方とずれが大きくなってい
>|るのが気になりますよね...
>
>そーですかねえ。もちろん、変数への代入は統一的なモデルがある
>わけですが、そうでないものは結局はメソッド呼び出しであると明
>言しているわけですから、ずれとは言わないんじゃないかと私は思
>います。

まあ, そういう風に言われるとその通りなのですが... 

>もともと obj.foo = val は「objのfooという属性をvalにする」という仮想的
>な意味なわけですから、obj.foo(a)=valは「objのfoo(a)という属性をvalにす
>る」という意味がとれる文脈でならば問題ない使い方でしょうし

objのfoo(a)という属性って微妙な概念ですよね. パターンとしては2通りあって

* (obj.foo)[a]
* obj[a].foo

他の意味の場合もあるのかしら??

# ひわださんの例はどっちかになっていると思います.

>(C++でリファレンスを返すようなコンテキスト)、

これに関しては後の方を参照してください -- (*)

>逆にそういう意味にとれない場合に使うのははっきり言っ
>て乱用でしょう。しかし、乱用される可能性があるからという理由
>では禁止する必要はないと思います。

禁止と言うか実装しない理由ってことですよね. でも, Rubyってコーディングレ
ベルにおける松本氏のポリシーがかなり入っていると思いますので, 乱用するこ
とによって可読性/保守性が下がるのだったら, 十分採用しない理由になってい
ると思うんですが...

ただし, RubyのほうがC++よりはまだよいと思います. 

(*) C++だとリファレンスやポインタを返す関数あればそれに代入できちゃいま
すので, 物凄いことができちゃいます. つまり, 関数の戻り値にオブジェクトを
返したいなら, リファレンスかポインタを返すようにしますので, そのような代
入を前提として作っていない関数に代入できちゃうんですね.

class Foo {
  Baz &general_func(param);
};

foo.general_func(param) = bar.baz(...)

とか.... 初めてこれをみたときには何が起こっているのか理解できなくてパニ
クッテしまいました(^^;;; 

# コーディングした人間はその当時新人でCをやらないでいきなりC++をはじめた
# 人間だったせいもあるのかもしれませんが, 本人としては全然違和感はなかっ
# たようです. 私は頼むからそれだけ早めてくれとお願いして, コードを変えて
# もらいましたが...

Rubyは foo(param)=を定義しなくてはいけないので, 上記のC++の例のようなこ
とは起こり得ませんからね. 

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

私も絶対反対と言うわけでもないんですけどね. 上記の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
>|
>|ぐらいですかね. ただ, メソッドの戻り値が違って来ると思いますが.
>
>そうですねえ。でも、これらはやっぱり「使いすぎ」のような気が
>します。

そうですか(^^;;;

__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---