【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