From: matz@... (Yukihiro Matsumoto) Date: 2003-06-17T10:56:49+09:00 Subject: [ruby-dev:20358] Re: 1.8.0 preview3 schedule まつもと ゆきひろです In message "[ruby-dev:20357] Re: 1.8.0 preview3 schedule" on 03/06/17, Koji Arai 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,|と同じ解 釈にするための移行措置です。 まつもと ゆきひろ /:|)