Ruby: each メソッド (Array クラス, Range クラス) によるイテレーション
ruby では、each を使ってイテレーションをする (each をイテレーターとしてイテレーションする、と言うべき?) のだけど、色々と忘れることが多いのでメモ書き。なお、each は Array のほかに、Range や RubyDCL の NArray とかでも使えます。
基本
array = [ 'apple', 'peach', 'pineapple'] array.each do |val| p 'I eat ' + val + '.' if( val[ 0 ] == 'a' ) p 'I like ' + val + '.' if( val[ 0 ] == 'p' ) end "I eat apple." "I like peach." "I like pineapple."
.each をつけられた配列の要素が順番にヴァーティカルライン (縦棒文字: "|") で囲まれた変数 (ここでは "val") に入れられて、end までの処理を要素ごとに順番に繰り返します。
Range 変数の場合
y = 2..6 # y = Range.new( 2, 6 ) y.each do |val| p val.to_s + " is even" if( val % 2 == 0 ) p val.to_s + " is odd" if( val % 2 == 1 ) p val.to_s + " is a multiple of 3" if( val % 3 == 0 ) end "2 is even" "3 is odd" "3 is a multiple of 3" "4 is even" "5 is odd" "6 is even" "6 is a multiple of 3"
繰り返した数をカウントする (each_with_index)
ヴァーティカルラインの間には、|配列要素の変数、カウンターの変数| を入れます。これは NArray では使えなかったはず…
array = [ "rice", "bread", "potato", "noodle" ] idx = 0 array.each_with_index do | val, idx | p val + "'s " + ( idx + 1 ).to_s + "th letter is " + val[ idx ] end "rice's 1th letter is r" "bread's 2th letter is r" "potato's 3th letter is t" "noodle's 4th letter is d"
参考サイト
配列を n 個おきに扱う (each_slice)
例えば、というより、今回私がやりたかったのが、[ 28, 28, 28, 64, 64, 64, 117, 117, 117, 133, 133, 133 ] のように、n (例では 3) 個ずつ連続で同じ数字が現れる配列の繰り返し部分を排除したい、というものでした。[ 28, 64, 117, 133 ] を作るのが目標です。n 個は既知とします:
ここから先はまだ書けてません…
参考サイトはこちら:
qiita.com