yucken の業務上電脳 Tips 日記、なのだよ。-弐式-

いまさら電脳 Tips といふものを、書いてみむとして、するなり.元々は広い意味での電脳(コンピュータ)の Tips を書いていたのですが,いつのまにか,解析ツールの「電脳 ruby」と IDL の Tips がメインに (・)>

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"

参考サイト

qiita.com
d.hatena.ne.jp

配列を n 個おきに扱う (each_slice)

例えば、というより、今回私がやりたかったのが、[ 28, 28, 28, 64, 64, 64, 117, 117, 117, 133, 133, 133 ] のように、n (例では 3) 個ずつ連続で同じ数字が現れる配列の繰り返し部分を排除したい、というものでした。[ 28, 64, 117, 133 ] を作るのが目標です。n 個は既知とします:

ここから先はまだ書けてません…

参考サイトはこちら:
qiita.com