From: matz@... (Yukihiro Matsumoto) Date: 2004-05-23T08:32:11+09:00 Subject: [ruby-dev:23569] Re: Ruby2.0 spec summary around parameters and variables まつもと ゆきひろです In message "[ruby-dev:23568] Re: Ruby2.0 spec summary around parameters and variables" on 04/05/23, Minero Aoki writes: |つまり、Values(1,2) == *[1,2] == *Values(1,2) なんですね。 はい。 |とすると、決まっていないのは左辺と右辺がマッチしない場合ですか。 決まっていないのは「ブロックパラメータで」左辺と右辺がマッチ しない場合です。 |以下に再度まとめておきます。右辺で Values と *Array を |区別する必要はなさそうなので、Values だけにしました。 | | a, b = 1 # a=1, b=nil | a, = 1 # ? a = 1 | a, * = 1 # ? a = 1 | *a = 1 # ? a = [1] | * = 1 # ? なにもおきない(エラーも) | a = 1 # a=1 | | a, b = Values(1,2) # a=1, b=2 | a, = Values(1,2) # ? a = 1 | a, * = Values(1,2) # a=1 | *a = Values(1,2) # a=[1,2] | * = Values(1,2) # なにもおきない(エラーも) | a = Values(1,2) # エラー a = Values(1,2) # 多重代入ではない | def yieldSingle | yield 1 | end | | yieldSingle {|a,b| } # a=1, b=nil エラーかも | yieldSingle {|a, | } # ? a = 1 | yieldSingle {|a,*| } # ? a = 1 | yieldSingle {|*a| } # a=[1] | yieldSingle {|a| } # a=1 | | def yieldValues | yield 1,2 | end | | yieldValues {|a,b| } # a=1, b=2 | yieldValues {|a, | } # ? エラーかも | yieldValues {|a,*| } # a=1 | yieldValues {|*a| } # a=[1,2] | yieldValues {|a| } # エラー | |思ったんですが、いっそ a,b=1 をエラーにしてしまったほうが |よくないですか。 多重代入でも両辺の数を合わせた方が良いということでしょうか。 |> def m(&block) |> Proc.call{p "OK"} |> end |> |> m{|&b| b.call} # => "OK" |> |> ですね。yieldがどう振る舞うかはまだ決めていません。yieldはメ |> ソッド全体で単一のスコープの方がわかりやすそうな気がしますが。 | |Proc.call は block.call ですよね。 はい。 |なんでかわかりませんが、call 経由で呼ぶのは納得できます。 |yield にブロックが渡せるのは非常に、非常に、非常に嫌です。 あとは、ブロックの中でyieldした場合、暗黙のブロック(yieldの 対象)は外側のものを継承する必要がありそうです。関数(or メソッ ド)と考えるとちょっと気持ちが悪いのですが。 まつもと ゆきひろ /:|)