Ruby1.9に新しい列挙子があるのを見ましたslice_before
。APIドキュメントはかなり不可解です。
特に、私はinitial_state
価値をとるバリエーションに困惑しています。
たとえば、要素の累進和がある値を超えるたびに、数値を含む配列をサブ配列に分割したいとします。
a = [1,2,0,1,2,3]
a.slice_before(0) do |elem, sum|
sum += elem
sum > 3
end.to_a
期待される出力:
[[1,2,0], [1,2], [3]]
合計は「キャリー」や「メモ」のようなものだと思いますinject
が、それはうまくいかないようです。
このコードの不具合は不可解なエラーです。
TypeError: can't dup Fixnum
from (irb):43:in `each'
初期値としてslice_before
を受け入れていないようです。Fixnum
なんで?Rubyのバグ?
自分の状態変数を保持することでこれを回避できますが、私が探していた美しいRubyセマンティクスではありません。
sum = 0
a.slice_before do |elem|
sum += elem
sum > 3 && sum = 0
end.to_a
# => [[1, 2, 0], [1, 2], [3]]
それでinitial_state
、この目的に使用できるかどうか?ドキュメントの例は、主にテキスト処理に関するもののようです。Ruby1.9.3p194を使用しています。