チェリー本 4章 その3

ブロックを使う配列メソッド

使用頻度が高い
配列メソッド

1.mapメソッド

各要素に対してブロックを評価した結果を新しい配列にして返すメソッド

配列numbersに入っている各数値要素を10倍して新しい
配列numbers_1に代入する式

numbers = [1, 2, 3, 4]
numbers_1 = []

numbers.map { |n| numbers_1 << n * 10 }
p numbers_1
=>
[10, 20, 30, 40]

mapメソッドはブロックの戻り値が配列になる為そのまま新しい変数に入れることができる。
numbers = [1, 2, 3, 4]

numbers_1 = numbers.map { |n| n * 10 }
p numbers_1
=>
[10, 20, 30, 40]

2.select /find_all/rejectメソッド

selectメソッドはブロックを評価してその結果がtrueの要素を集めて配列に返すメソッド
rejectメソッドはselectの逆でtrueの要素を除外する

numbers = [1, 2, 3, 4]

p numbers_1 = numbers.select { |n| n.even? } #numbers配列の偶数になる数値を引き抜く
=>
[2, 4]

numbers = [1, 2, 3, 4]

p numbers_1 = numbers.reject { |n| n.even? }#numbers配列の偶数になる数値を除外する。
=>
[1, 3]

3.findメソッド

ブロックの戻り値がtrueになった最初の要素のみ返す

numbers = [1, 2, 3, 4]
p numbers_1 = numbers.find { |n| n.even? }

4.inject/reduceメソッド

畳み込み演算を行うメソッド

numbers = [1, 2, 3, 4]
num = 0
numbers.each { |n| num += n }
p num

#1~4を順に足していくコード
#これをinjectで書いていくと
numbers = [1, 2, 3, 4]
num = numbers.inject(0) { |x, y| x += y }
p num

=>10

1.まず第一ブロック引数xにinject(0)の0が渡される。num = 0の役目
2.nには配列の一番最初の要素1が入る。配列で渡される普通の挙動
3.x + y  が行われて =>  0 + 1の結果が次のxにはいる。
4.xには1、yには2が渡された結果がxに入るこれの繰り返し

p ((((0 + 1) + 2) + 3) + 4)
と同じ式になる。

#injectメソッドは文字列にも使える。
weeks = ["Mon", "The", "Web", "Thu", "Fri", "Sat"].inject("Sum") { |result, s| result + s }
p weeks

=>
"SumMonTheWebThuFriSat"

&とシンボルを使って簡潔に書く

通常使うブロックの下記かより簡潔に書く方法がある。

#通常のブロックの書き方と
p num = [1, 2, 3, 4, 5, 6].select { |n| n.odd? }

省略記法
p num = [1, 2, 3, 4, 5, 6].select(&:odd?)

ただし省略記法を使える時の条件が存在する。

  • ブロックの引数が1つ
  • ブロックの中で呼び出すメソッドには引数がない。
  • ブロックの中でブロック引数に対してメソッドを一回呼び出す以外の処理がない
["ruby", "java", "perl"].map { |s| s.upcase }