新井です。 In message "[ruby-dev:20347] 1.8.0 preview3 schedule" on Sat, 14 Jun 2003 21:26:13 +0900, matz / ruby-lang.org (Yukihiro Matsumoto) wrote: > まつもと ゆきひろです > まだ確定してない重要な変更はBlockとProcの分離です。現在の仕様は確定で > はありません。Blockに合わせた変更は行わないでください。月曜までには決 > 心します。おそらくBlockというクラスはなくなります。 ruby 1.8.0 (2003-06-16) [i586-linux] ですが、まだ 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 を生成する? ・今まで、rb_f_lambda() だったものは代わりに rb_block_proc() を使うべき? Proc.new {|a,b| p [a,b]}.call(1,2,3) => -:1: wrong # of arguments (3 for 2) (ArgumentError) from -:1:in `call' from -:1 ruby 1.6.8 (2002-12-24) [i586-linux] => ruby 1.8.0 (2003-06-16) [i586-linux] [1, 2] lambda {|a,b| p [a,b]}.call(1,2,3) => -:1: wrong # of arguments (3 for 2) (ArgumentError) from -:1:in `call' from -:1 ruby 1.6.8 (2002-12-24) [i586-linux] => -:1: wrong number of arguments (3 for 2) (ArgumentError) from -:1:in `call' from -:1 ruby 1.8.0 (2003-06-16) [i586-linux] と、Proc.new の方が引数チェックが緩いですね 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] と、ブロックパラメータが一つの場合、いずれも警告が出るのはよくわかりません。 私、勘違いしてる可能性が高いです。 -- 新井康司 (Koji Arai)