なりちゅうのエンジニアブログ

毎日学んだことをちょっとずつブログに書いていきます。

【Rubyメモ】配列の要素で最初と最後だけ特別な処理をする

配列の最後だけ特別な処理をしたかったり、逆に処理したくない時がたまにありますが、自分の中でもなんとなく書いていたのでまとめてみます。

配列の中で最初と最後だけ処理をする

each_with_indexを使う

array = [1, 2, 3, 5, 8, 13]
array.each_with_index do |num, index|
  if index == 0
    puts "最初の処理"
  end
  if index == array.size - 1
    puts "最後の処理"
  end
  puts num
end

色々調べてみましたが、基本的にはこのやり方以外なさそうです。 なお、Enumeratorクラスに with_index メソッドが使えるとのことなので、 array.each.with_index でも可。

配列の中で最初と最後だけ処理をしない方法

each_with_indexを使う

array = [1, 2, 3, 5, 8, 13]
array.each_with_index do |num, index|
  next if index == 0 || index == array.size - 1
  puts num
end

こちらも、each_with_index を使うのが良いみたいです。最初と最後の要素のときだけ next を使用します。

おまけ

最後の要素だけ処理をしない、というのに限り良さそうな方法を見つけました。

単純にeachを書くと

array = ['a', 'b', 'c', 'd']
str = ""
array.each_with_index do |obj, index|
  str += (obj + ', ') if index < array.size - 1
end
puts str # => 'a, b, c, d'

こんな感じでしょうか。

injectを使う

array = ['a', 'b', 'c', 'd']
puts array.inject('') do |str, obj|
  str + ', ' + obj
end  # => 'a, b, c, d'

inject メソッドを使用します。結構難しいメソッドですが、コツを掴むとめちゃくちゃ使いやすいです。 inject(初期値) do |メモ変数, 配列item| って感じです。 イテレーターのブロックの前回の戻り値がメモ引数に毎回格納されます。 よって間になにかを挟む系の処理はこれで基本はできます。

よくありますが、改行を含む文字を手軽に<br>に変換したい!というのもこの通り。(join使えというツッコミは無しで)

text.split('\n').inject{|e, n| e + '<br>' + n}.html_safe

参考

blog.toshimaru.net

qiita.com