[前][次][番号順一覧][スレッド一覧][生データ]

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  ]