プロを目指す人のための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クラスの公式リファレンスを見ること徹底します(自分でメソッド考えなくていいと楽そう)
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者: 伊藤淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
- この商品を含むブログを見る