1. hanachin_

    Posted

    hanachin_
Changes in title
+Ruby 2.7の新機能メソッド参照演算子
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,103 @@
+`method`メソッドを短く書けるメソッド参照演算子の紹介です。
+https://bugs.ruby-lang.org/issues/12125
+https://github.com/ruby/ruby/commit/67c574736912003c377218153f9d3b9c0c96a17b
+
+## `method`メソッドとは
+
+メソッドを`Method`オブジェクトとして取り出せるべんりメソッド
+https://docs.ruby-lang.org/ja/latest/method/Object/i/method.html
+
+```rb
+123.method(:to_s)
+# => #<Method: Integer#to_s>
+```
+
+## `Method`オブジェクトとは
+
+メソッドとレシーバーが対になったオブジェクトで`Proc`と同じように呼び出せる。
+https://docs.ruby-lang.org/ja/latest/class/Method.html
+
+```rb
+meth = 123.method(:to_s)
+# => #<Method: Integer#to_s>
+meth.call
+# => "123"
+meth.call(16)
+# => "7b"
+```
+
+## メソッド参照演算子
+
+`.:`で`method`メソッドと同じようにメソッドを`Method`オブジェクトとして取り出せる。
+
+```rb
+123.:to_s
+# => #<Method: Integer#to_s>
+```
+
+## `method`メソッドが上書きされていても`.:`なら`Method`オブジェクトを取り出せる
+
+`method`メソッドが上書きされていてもメソッド参照演算子はメソッドを取り出せる。べんり。
+
+```rb
+class Object
+ def method(*)
+ nil
+ end
+end
+
+123.method(:to_s)
+# => nil
+
+123.:to_s.call
+# => "123"
+```
+
+refineで上書きされていても大丈夫
+
+```rb
+using Module.new { refine(Object) { def method(*); nil; end } }
+method(:puts)
+# => nil
+self.:puts
+# => #<Method: main.puts>
+```
+
+refineで定義したメソッドは取り出せない
+
+```rb
+using Module.new { refine(Object) { def method(*); nil; end } }
+self.:method.call(:puts).call(1)
+# 1
+```
+
+## 単項演算子を取り出す場合
+
+`method`メソッド同様`-@`/`+@`のような形でで取り出せる
+
+```rb
+1.method(:-@).call
+# => -1
+1.:-@.call
+# => -1
+```
+
+## べんりなのか
+
+ブロックわたして何かする系のEnumerable的な処理書くときに便利そう。
+
+```rb
+[1,2,3].map(&2.:*)
+# => [2, 4, 6]
+
+["エロ"].any?(&"イエロー".:include?)
+# => true
+
+require "prime"
+(1..10).select(&Prime.:prime?)
+# => [2, 3, 5, 7]
+```
+
+## まとめ
+
+trunkのrubyを入れるとすぐに`.:`を使えるのでべんりです。