Madogiwa Blog

主に技術系の学習メモに使っていきます。

ruby2.7の新機能メソッド参照演算子を使ってみよう

5/30にRuby 2.7.0-preview1がリリースされましたね🎉

www.ruby-lang.org

2.7の主要な新機能としては下記が記載されています👀

  • Pattern Matching
  • メソッド参照演算子 .:
  • 始値省略範囲式 ..100
  • 番号指定パラメータ @1
  • Enumerable#tally

今回は、中でもメソッド参照演算子が個人的に結構気になっているので、それについて書いていこうかなと思います✍

メソッド参照演算子とは

メソッド参照演算子とは.:という演算子でメソッドオブジェクトを取得できる演算子です。

サンプルコードは下記のような感じです。

irb(main):001:0> "0".:to_i
=> #<Method: String#to_i>

今まではClass#methodで取得することが出来ましたが、より簡単にかけるようになったという感じですね👀

メソッドオブジェクトとは

メソッドオブジェクトはメソッドから生成されたProcのようなものです。同じように#callで実行できます。

irb(main):001:0> "0".:to_i
=> #<Method: String#to_i>
irb(main):002:0> "0".:to_i.call
=> 0

Procとの違いとか詳細は、Rubyリファレンスマニュアルを参照してくださいm( )m

docs.ruby-lang.org

どう使えるのか?

こういうコレクションの各要素に対してオブジェクト以外のメソッドを適用したいときに便利そうですね👀

# 2.6
[0, 1, 2].map { |i| i + 1 }
# 2.7
[0, 1, 2].map(&1.:+)

番号指定パラメータでもいい感じにかけるかもしれないですが、メソッド参照演算子の方が(&:hoge)といった見慣れた形式でかけるので見やすそうですね。(下記のケースだとそうでもないですが。。。)

[0, 1, 2].map(&1.:+)
=> [1, 2, 3]
[0, 1, 2].map{ @1 + 1 }
=> [1, 2, 3]

実践的な例だとcurrent_userと合致するuserを取得するとか、メソッド参照演算子を使うと&を使ってスッキリかけますね👍

# 2.6
users.find { |user| corrent_user == user }
# 2.7
users.find(&corrent_user.id.:eql?)

hashの配列をもとにモデルのオブジェクトの配列を取得するとかも、いい感じにかけそうですね✨

# 2.6
attrs.map { |attr| Blog.new(attr) }
# 2.7
attrs.map(&Blog.:new)

おわりに

今回はruby 2.7の新機能のメソッド参照演算子を紹介してみました。2.7ではパターンマッチングや番号指定パラメータが話題になることが多いですが、irbJITの改善とか他にもいろいろ注目すべき点がありそうですね🙌今から2.7のリリースが楽しみです✨

参考

qiita.com