From: matz@... (Yukihiro Matsumoto) Date: 2004-05-22T21:48:35+09:00 Subject: [ruby-dev:23564] Re: Ruby2.0 spec summary around parameters and variables まつもと ゆきひろです In message "[ruby-dev:23563] Re: Ruby2.0 spec summary around parameters and variables" on 04/05/22, Minero Aoki writes: |いま ruby-dev summary を書いているのですが、細部の動作に |確信が持てないので教えてください。現在までの情報から |次のような動作を予想したのですが、間違っているところは |あるでしょうか。 | | def m | return [1, 2] | end | | a, b = m() | p a #=> [1, 2] | p b #=> nil これは正しいです。 | a, b = *m() | p a #=> [1, 2] | p b #=> nil これはa=1,b=2です。なぜなら、 * m()が配列を返す * 「unary* (splat)」によってValues化される * Valuesの各要素が各左辺に代入される からです。 | def m2 | return 1, 2 | end | |# ここらへんが怪しい | a, b = m() これはm()じゃなくてm2()ですよね。 | p a #=> Values(1,2) | p b #=> nil これもa=1,b=2になります。 * m2()がValuesを返す * Valuesの各要素が各左辺に代入される からです。 | a, b = *m2() | p a #=> 1 | p b #=> 2 これは正しいです。Valuesにunary *を適用した結果もValuesだか らです。 | def iter | yield [1,2] | end | | iter do |a, b| | p a #=> [1, 2] | p b #=> nil | end 正しいです。 | def iter2 | yield 1, 2 | end ここからはiterじゃなくiter2でしょうね。置き換えてあります。 | iter2 do |a, b| | p a #=> 1 | p b #=> 2 | end 正しいです。 | iter2 do |a, | | p a #=> 1 | end これはまだ決定していません。候補は * 正しい * エラー(パラメータの数が違う) です。 |# これも怪しい | iter2 do |a| | p a #=> Values(1,2) | end これはエラーになります、たぶん。ブロックパラメータの渡し方は メソッドパラメータに準じ、多重代入ではなくなるからです | iter2 do |*args| | p args #=> [1, 2] | end 正しいです。 |> == yield や Proc#call にブロックを渡すことを許すか |> |> (matz)許そうと思っています。 | |これは、次のようなことができるということですか? | | def m | yield { p "OK" } | end | m { yield } #=> "OK" あ、yieldは許さないでよいかなと思っています。で、 Proc#callですが、 def m(&block) Proc.call{p "OK"} end m{|&b| b.call} # => "OK" ですね。yieldがどう振る舞うかはまだ決めていません。yieldはメ ソッド全体で単一のスコープの方がわかりやすそうな気がしますが。 まつもと ゆきひろ /:|)