まつもと ゆきひろです

In message "[ruby-list:10243] Re: for が修飾子だったら"
    on 98/10/22, Junichi Kurokawa <jun / mew.gol.com> writes:

|    Y> は「exprのeachというメソッドを引数なしで呼び出している」とみなす
|    Y> ことができ,これだけで完全な文になっています.
|
|それは既に聞きました。ただし、なぜ「とみなすことが出来る」のか説明が欠落
|していました。今回もなく、不満です。

ん? 「文法がそうだから」という説明をしていたのですが,もし
かすると「なぜそのような文法なのか」ということを聞きたかった
のですか? だとするとやや的外れな回答でしたね.すみません.

|イタレーターのあとにはブロックが来るものではないんですか。ブロックが来る
|可能性がある場合はブロックおよびひいてはブロックの終わりを明示すべきです
|ね。ほかにもperl(1)はifなどにブロックの省略を許しません。

イテレータというのは単なるメソッドなんですよ.ですから,ブロッ
クが来る可能性があるというのは全てのメソッド呼び出しの直後に
なります.

まず,Rubyの「ブロック」と他の言語の「ブロック」は明確に違う
ものです.そこを御理解いただきたいです.

他の言語のブロックとはたとえばPerlにおけるifの後ろの{}のよう
な「文かっこで括られた範囲」のことです.このような「文の集ま
り」がオプショナルな言語はほとんどありませんし,「このような
「ブロック」の終りを明示すべし」という意見は理解できます.実
際にRubyではendを使った文法によって「文の範囲」を明示してい
ます.ですから,例えばCのような「ぶらぶらelse問題」とは無縁
です

一方,Rubyにおけるブロックは「メソッドの(暗黙の)引数として渡
すことの出来る文の塊」です.メソッドに与えることもありますし,
与えないこともあります.ブロックを与えられることを期待してい
るメソッドのことを特に「イテレータ」と呼ぶこともありますが,
単なる呼び名で文法上「イテレータ」という構文要素があるわけで
はありません.

さて,このような「(Rubyの)ブロック」およびブロックの終りを明
示すべきか,という点ですが,形式こそ特殊であるものの,ブロッ
クはメソッドの引数に過ぎない点を考えると明示する必要はないと
考えました.メソッド呼び出し毎に(必要もないのに)ブロックを指
定するのも不便ですし.

まとめると

  * イテレータという構文要素はない
  * ブロックは省略可能なメソッドの引数(形式は特殊)
  * ブロックをいつも明示するのは不便

ということで,現在のような仕様になっています.

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