Rubyのtapメソッドとinjectメソッド

Rubyのtapメソッドとinjectメソッド

みなさんこんにちは、新人の意識高丸です。
昨日も初心者Ruby勉強会「gaienrb」に参加してきました。
今回はRailsチュートリアルの6章の最後から7章にはいるところまですすめました。

途中ですこし横道にそれて、tapメソッドとinjectメソッドについて調べました。

tapメソッドはブロック変数にレシーバ自身を入れてブロックを実行するメソッドで、戻り値はレシーバ自身になるようです。これはObjectクラスに実装されています。
戻り値がレシーバ自身というのがポイントだと思いました。
あまり用途を見いだせないのですが、配列なんかの中身を出力するときにtapメソッドを差し込むと使えそうです。

例えば以下のようなtaro,jiro,saburoという3つの名前が入った配列の各値にYAMADAという苗字を付けるコードにおいて


[“taro”,”jiro”,”saburo”].map{|name|”YAMADA”+name}
=> [“YAMADAtaro”, “YAMADAjiro”, “YAMADAsaburo”]

以下のようにtapを差し込んでtapの中でプリントすると、mapメソッドのところでYAMADAという苗字を付ける前のデータをtapで出力できます


[“taro”,”jiro”,”saburo”].tap{|name| p name}.map{|name|”YAMADA”+name}
[“taro”, “jiro”, “saburo”]
=> [“YAMADAtaro”, “YAMADAjiro”, “YAMADAsaburo”]

このようにメソッドチェーンの中に差し込んで値を確認するのに便利だと思いました。

続いてinjectメソッドは、ブロックを使って繰り返し計算をするのに使うようです。
要素順に前回の戻り値とその要素の値がブロック引数に渡されて実行されます。

以下のようにすると、1から10までの値を足した結果を取得できます。


(1..10).inject{|sum,value|sum+value}
=> 55

injectメソッドは、ブロックの代わりにシンボルでメソッド名を渡すことができ、メソッド名を渡すと、「要素1.メソッド(要素2)」、「前回の結果.メソッド(要素3)」、…を計算していき、最後の結果を返します。
そのため、1から10までの値を足した結果を取得する場合は以下のようにも書くことが出来ます。


(1..10).inject(:+)
=> 55

上記のコードは初めて見たときはわかりにくいですが、仕組みがわかってしまえば難しいことは無いと思います。

Rubyにはまだ使ったことのないメソッドなどが沢山あると思うので、積極的に発掘していきたいと思います。
沢山知っていればコードを簡潔にすることが出来ると思います。

TAG

  • このエントリーをはてなブックマークに追加
意識 高丸
エンジニア 意識 高丸 takamaru

Rubyについて日々勉強している新人エンジニアです。初心者向けRuby勉強会のレポートなどを投稿していきます。