yarv-dev:583
From: SASADA Koichi <ko1 atdot.net>
Date: Tue, 16 Aug 2005 08:15:18 +0900
Subject: [yarv-dev:583] Re: yield multi values
ささだです。
もうちょっと調べていたんですが、
def iter args
yield *args
end
iter([]){|a|
p [a]
}
iter([1]){|a|
p [a]
}
iter([1, 2]){|a|
p [a]
}
iter([1, 2, 3]){|a|
p [a]
}
これだと最近は警告が出るんですね。
../yarv/test1.rb:18: warning: multiple values for a block parameter (0
for 1)
from ../yarv/test1.rb:2
[nil]
[1]
../yarv/test1.rb:24: warning: multiple values for a block parameter (2
for 1)
from ../yarv/test1.rb:2
[[1, 2]]
../yarv/test1.rb:27: warning: multiple values for a block parameter (3
for 1)
from ../yarv/test1.rb:2
[[1, 2, 3]]
今の YARV はただ単にこう出力します。
[nil]
[1]
[1]
[1]
SASADA Koichi wrote:
> ささだです。
>
> 現在のイテレータの仕様では、多値(Values)や配列を yield に渡したと
> き、受け側のブロックパラメータの数でどうなるか色々変わります。
>
> h = {:a => 1}
> h.each{|k, v|
> p [k, v] #=> [:a, 1]
> }
> h.each{|kv|
> p kv #=> [:a, 1]
> }
>
> 他にも、
>
> [1,2,3].each{|a|
> p a #=> [1, 2, 3]
> }
> [1,2,3].each{|a, b|
> p [a, b] #=> [1, 2]
> }
>
> とか。
>
> この辺はブロックパラメータの引数の設定は多重代入である、という原則があ
> るためですが、この仕様は Ruby2.0 においても同様でしょうか。それとも、変
> わりますか。あと、考え中とか。
>
> この辺は YARV ではスゲーアドホックにやっています。ただ、「多重代入の原
> 則」を利用した既存のプログラムが結構たくさんあるため、これからの開発をど
> うしたもんかなー、と悩んでいます。
>
> アドホックに対応してるのは、ネストしてない多重代入のやつで、ネストして
> るやつはそもそも非対応。
>
> ((a, b), c) = [[1, 2], 3] #=> 非対応
>
> ついでに、これは Ruby 2.0 にも持ち込むこと決定ですかね。決定なら真面目
> に実装します。
>
--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml
582 2005-08-16 06:54 [ko1 atdot.net ] yield multi values -> 583 2005-08-16 08:15 ┣[ko1 atdot.net ] 612 2005-09-16 16:54 ┗[matz ruby-lang.org ]