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 で実装できます。(清書が面倒くさいので) これは読者の課題とします。