新井です。
多重代入の挙動を調べていました。2003-08-28 の変更で return
の挙動がおかしくなった部分があるように思われます。
多重代入、ブロックパラメータ、return はそれぞれ同じ挙動を示
すものと考えていたのですが実際のところ空の return は return
nil の省略形になっているのですね。
以下の結果が望ましいものなのかどうかご確認ください。
*a = *[]; p a
def f; yield; end; f {|*a| p a}
def r; return; end; *a = r(); p a
=> ruby 1.6.8 (2003-08-03) [i586-linux]
[]
[nil]
[nil]
=> ruby 1.8.0 (2003-08-04) [i586-linux]
[]
[]
[nil]
=> ruby 1.8.0 (2003-08-28) [i586-linux]
[]
[]
[nil]
*a = *[]; p a
def f; yield *[]; end; f {|*a| p a}
def r; return *[]; end; *a = r(); p a
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.6.8 (2003-08-03) [i586-linux]
[]
[]
[]
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.8.0 (2003-08-04) [i586-linux]
[]
[]
[nil]
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.8.0 (2003-08-28) [i586-linux]
[]
[]
[nil]
*a = *[1,2]; p a
def f; yield *[1,2]; end; f {|*a| p a}
def r; return *[1,2]; end; *a = r(); p a
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.6.8 (2003-08-03) [i586-linux]
[1, 2]
[1, 2]
[1, 2]
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.8.0 (2003-08-04) [i586-linux]
[1, 2]
[1, 2]
[1, 2]
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.8.0 (2003-08-28) [i586-linux]
[1, 2]
[1, 2]
[[1, 2]]
*a = *[*[]]; p a
def f; yield *[*[]]; end; f {|*a| p a}
def r; return *[*[]]; end; *a = r(); p a
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.6.8 (2003-08-03) [i586-linux]
[]
[]
[]
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.8.0 (2003-08-04) [i586-linux]
[]
[]
[nil]
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.8.0 (2003-08-28) [i586-linux]
[]
[]
[nil]
*a = *[*[1,2]]; p a
def f; yield *[*[1,2]]; end; f {|*a| p a}
def r; return *[*[1,2]]; end; *a = r(); p a
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.6.8 (2003-08-03) [i586-linux]
[1, 2]
[1, 2]
[1, 2]
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.8.0 (2003-08-04) [i586-linux]
[1, 2]
[1, 2]
[1, 2]
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.8.0 (2003-08-28) [i586-linux]
[1, 2]
[1, 2]
[[1, 2]]
a,b,*c = *[[]]; p [a,b,c]
def f; yield *[[]]; end; f {|a,b,*c| p [a,b,c]}
def r; return *[[]]; end; a,b,*c = r(); p [a,b,c]
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.6.8 (2003-08-03) [i586-linux]
[[], nil, []]
[nil, nil, []]
[[], nil, []]
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.8.0 (2003-08-04) [i586-linux]
[nil, nil, []]
[nil, nil, []]
[nil, nil, []]
=> -:2: warning: `*' interpreted as argument prefix
ruby 1.8.0 (2003-08-28) [i586-linux]
[[], nil, []]
[[], nil, []]
[nil, nil, []]
--
新井康司 (Koji Arai)