まつもと ゆきひろです

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はメ
ソッド全体で単一のスコープの方がわかりやすそうな気がしますが。

                                まつもと ゆきひろ /:|)