まつもと ゆきひろです
In message "[ruby-dev:23563] Re: Ruby2.0 spec summary around parameters and variables"
on 04/05/22, Minero Aoki <aamine / loveruby.net> 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はメ
ソッド全体で単一のスコープの方がわかりやすそうな気がしますが。
まつもと ゆきひろ /:|)