イテレータの prev

Rubyイテレータには next があるのに prev がありません。不自然です。しょうがないので仕様だけ作ってみました。


配列先頭からランダムウォーク。配列から外れたら終了。

a = []
[1,2,3,4,5].each_with_prev do |i|
    a << i
    (rand > 0.5) ? next : prev
end
p a
$ ruby rwalk.rb
[1, 2, 3, 2, 3, 4, 3, 2, 3, 2, 1]
$ ruby rwalk.rb
[1, 2, 3, 4, 3, 4, 5]
$ ruby rwalk.rb
[1]

配列を順に辿って、"ぶ" という要素に当たったら逆走。

s = ""
d = "next"
%w(た け や ぶ).each_with_prev do |x|
    s << x
    d = "prev" if x == ""
    eval d  # ruby 1.8 専用
end
p s  #=> "たけやぶやけた"

三歩進んで二歩下がる。

a = []
ds = %w(next next next prev prev)
(1..6).to_a.each_with_prev do |i|
    a << i
    ds << d = ds.shift
    eval d  # ruby 1.8 専用
end
p a  #=> [1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6]


さて、Ruby はすばらしいので、この仕様を pure Ruby で実装できます。(清書が面倒くさいので) これは読者の課題とします。