まつもと ゆきひろです
In message "[ruby-dev:20357] Re: 1.8.0 preview3 schedule"
on 03/06/17, Koji Arai <JCA02266 / nifty.ne.jp> writes:
|ですが、まだ Block という単語がソース上にあります。
|
|% grep -n Block *.[ch]
|eval.c:96:VALUE rb_cBlock, rb_cProc;
|eval.c:6841: proc ? "Proc" : "Block");
|eval.c:7152: b = rb_check_convert_type(block, T_DATA, "Block", "to_proc");
|eval.c:7154: rb_raise(rb_eTypeError, "wrong argument type %s (expected Block)",
|eval.c:7583: rb_raise(rb_eTypeError, "wrong argument type %s (expected Block/Method)",
|eval.c:7605: rb_raise(rb_eTypeError, "wrong argument type (expected Block/Method)");
|eval.c:7636: rb_cBlock = rb_cProc;
|ruby.h:578:RUBY_EXTERN VALUE rb_cBlock;
直していかないといけませんね。
|それはそれとして、結局 1.6 から比べて何が変わったか解説して
|いただけるととてもありがたいです。
|
|・内部的に Block と Proc を区別するようになったが、外見えはいずれもProc?
| ・ Blockは引数チェックがゆるい。breakやnextが例外になる
| ・ Procは引数チェックが厳しい。breakやnextは実行の中断
|・Proc.new は Proc を生成して、lambda、proc は Block を生成する?
という説明の仕方は混乱を招くので、
* Proc.newおよびブロック引数で与えられるProcは、引数チェッ
クがゆるい。breakやnextが例外になる
* lambdaおよびprocが返すProcは、引数チェックが厳しい。
breakやnextは実行の中断
という説明にしましょう。
|・今まで、rb_f_lambda() だったものは代わりに rb_block_proc() を使うべき?
はい。
| Proc.new {|a| p a}.call(1,2,3)
| => ruby 1.6.8 (2002-12-24) [i586-linux]
| [1, 2, 3]
| => -:1: warning: multiple values for a block parameter (3 for 1)
| ruby 1.8.0 (2003-06-16) [i586-linux]
| [1, 2, 3]
| lambda {|a| p a}.call(1,2,3)
| => ruby 1.6.8 (2002-12-24) [i586-linux]
| [1, 2, 3]
| => -:1: warning: multiple values for a block parameter (3 for 1)
| ruby 1.8.0 (2003-06-16) [i586-linux]
| [1, 2, 3]
|
|と、ブロックパラメータが一つの場合、いずれも警告が出るのはよくわかりません。
ブロックパラメータがひとつの場合には、今回の件とは独立にブロッ
クパラメータの使い方を矯正するために警告を出してます。
つまり、以前は|a|は解釈として|a,|(引数が一つの時)と|*a|(引数
が複数の時)の中間の働きをしていましたが、これを|a,|と同じ解
釈にするための移行措置です。
まつもと ゆきひろ /:|)