プロを目指す人のためのRuby入門・第4章重要ポイントまとめ

「プロを目指す人のためのRuby入門」の第4章を読み終わりました

個人的に重要と判断したポイントをまとめます。

Enumerableモジュール

インクルードされているクラスを調べました
・Array
・Hash
・Range
・Dir
・Enumerator
・IO
・Struct

試しに、Enumerableモジュールで定義されているall?メソッドを配列オブジェクトに対して呼び出してみました。

#all?メソッドはブロックの戻り値がすべて真であればtrueを返す

#ブロックの戻り値がすべてIntegerオブジェクトなのでtrueが返る
[1, 2, 3].all? { |n| n.kind_of?(Integer) } #=> true

#'に'はStringオブジェクトなので、falseが返る
[1, 'に', 3].all? { |n| n.kind_of?(Integer) } #=> false 

以上より、配列オブジェクトはEnumerableモジュールをインクルードしていることが確認できました。

また、文字列オブジェクトに対してall?メソッドを呼び出してみたところ

'あいうえお'.all? { |s| s.kind_of?(String) } 

NoMethodError: undefined method `all?' for "あいうえお":String

NoMethodErrorが出てしまいました。
よって、StringクラスはEnumerableモジュールをインクルードしていないことを確認できました。
(Ruby1.8まではインクルードしていたようです)

injectメソッドを使うと、ブロックの戻り値がinjectメソッド自身の戻り値になる
#eachメソッドは、戻り値がeachメソッドを呼び出したオブジェクト自身となる

sum = 0

[1, 2, 3, 4].each do { |n| sum += n }  #=> [1, 2, 3, 4]

puts sum #=> 10

#injectメソッドはブロックの戻り値がinjectメソッド自身の戻り値となるため、あらかじめブロックの戻り値を代入するための変数を定義する必要がない

['エッセル', 'スーパーカップ'].inject('明治') { |name, s| name += s } #=> '明治エッセルスーパーカップ'

感想
EnumerableモジュールとArrayクラスののAPIを調べたときに、非常に多くのメソッドが準備されていることに驚きました。
自分で思いつくようなメソッドは全部準備されているんじゃないだろうか…
配列をいじりたくなったらEnumerableモジュールとArrayクラスの公式リファレンスを見ること徹底します(自分でメソッド考えなくていいと楽そう)