From: SASADA Koichi Date: 2007-06-26T00:57:16+09:00 Subject: [ruby-dev:31047] block parameter complete?  ささだです。  ブロックパラメータについて、自分が把握している分については実 装しました。なんか抜けがあったら教えてください。  1.8 との相違点は、たぶんこんなところです: ・複数引数での yield を、1 引数の場合配列としてうけない -- ruby -ve "Proc.new{|a| p a}.call(1, 2)" ruby 1.8.5 (2006-08-25) [i486-linux] -e:1: warning: multiple values for a block parameter (2 for 1) from -e:1 [1, 2] -- ./miniruby -ve "Proc.new{|a| p a}.call(1, 2)" ruby 1.9.0 (2007-06-25 patchlevel 0) [i686-linux] 1 ・post arg の対応  これ、一点難しいポイントがあって、|a, b, *r, p1, p2| のとき に、「3引数」渡されたとき、p1 もしくは p2、どちらに入れるべき でしょうか。とりあえず、最後に nil をつめたと解釈し、p1 へ代入 するように実装しました。 ・オプショナル引数の対応(lambda) ・ブロック引数の対応 ・実行例: p :lambda f = -> (m1, m2, o1=:o1, o2=:o2, *r, p1, p2) {[m1, m2, o1, o2, r, p1, p2]} (4..10).each{|e| p ary = (0...e).to_a p f.call(*ary) puts } p :Proc pr = Proc.new{|m1, m2, m3, *r, p1, p2, p3| [m1, m2, m3, r, p1, p2, p3]} (0..10).each{|e| p ary = (0...e).to_a p ary = pr.call(*ary) puts } #=> :lambda [0, 1, 2, 3] [0, 1, :o1, :o2, [], 2, 3] [0, 1, 2, 3, 4] [0, 1, 2, :o2, [], 3, 4] [0, 1, 2, 3, 4, 5] [0, 1, 2, 3, [], 4, 5] [0, 1, 2, 3, 4, 5, 6] [0, 1, 2, 3, [4], 5, 6] [0, 1, 2, 3, 4, 5, 6, 7] [0, 1, 2, 3, [4, 5], 6, 7] [0, 1, 2, 3, 4, 5, 6, 7, 8] [0, 1, 2, 3, [4, 5, 6], 7, 8] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, [4, 5, 6, 7], 8, 9] :Proc [] [nil, nil, nil, [], nil, nil, nil] [0] [0, nil, nil, [], nil, nil, nil] [0, 1] [0, 1, nil, [], nil, nil, nil] [0, 1, 2] [0, 1, 2, [], nil, nil, nil] [0, 1, 2, 3] [0, 1, 2, [], 3, nil, nil] [0, 1, 2, 3, 4] [0, 1, 2, [], 3, 4, nil] [0, 1, 2, 3, 4, 5] [0, 1, 2, [], 3, 4, 5] [0, 1, 2, 3, 4, 5, 6] [0, 1, 2, [3], 4, 5, 6] [0, 1, 2, 3, 4, 5, 6, 7] [0, 1, 2, [3, 4], 5, 6, 7] [0, 1, 2, 3, 4, 5, 6, 7, 8] [0, 1, 2, [3, 4, 5], 6, 7, 8] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, [3, 4, 5, 6], 7, 8, 9] -- // SASADA Koichi at atdot dot net