From: aycabta@... Date: 2017-12-04T11:28:56+00:00 Subject: [ruby-dev:50336] [Ruby trunk Feature#14142] Add Method#=== Issue #14142 has been updated by aycabta (ayca bta). ```ruby case value when proc { |v| receiver.hoge(v) } end ``` とすることもできますが、この issue にあるパッチで実現される方法のほうが Rubyish で良いと思います。 ```ruby case value when receiver.method(:hoge).to_proc end ``` とすれば今でも意図と同じものは可能ですが、微妙に Proc っぽいけど Proc じゃない Method のために #to_proc を呼び出しているだけであり、これは #=== が存在すればより良くなると思います。 余談: この件は issue を立てた本人から以前より聞いていました。2 週間ほど前、シアトルに行った時に @zenspider にこの件を相談したのですが、「Method にも #curry があってそれは Proc を返す。そういう Proc との交換可能性みたいなものも見られるのに Proc#=== があって Method#=== が無いのは確かに中途半端だね」という話をしました。確かに Method#=== を入れたほうがいい理由はいくらでもありそうに思います。 ---------------------------------------- Feature #14142: Add Method#=== https://bugs.ruby-lang.org/issues/14142#change-68184 * Author: osyo (manga osyo) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- ## 概要 Ruby の `Method` クラスに対する提案になります。 初めてこちらを利用するので内容や書き方などに対する問題があれば教えていただけると助かります。 ## 提案 `Method#call` と同等の `Method#===` を定義する。 ## 理由 `Proc` では `Proc#===` が `Proc#call` の同等のメソッドとして定義されています。 `Method` が `Proc` のように振る舞うことを期待するのであれば、`Proc#===` と同等の `Method#===` が定義されている方がよいのではないでしょうか。 ## ユースケース 以下のようにして `Proc` と同様に `when` で使用する事が出来るようになります。 ```ruby # when で使用する def check value case value when 0.method(:<) "plus" when 0.method(:>) "minus" when 0.method(:==) "zero" end end p check 3 # => "plus" p check -6 # => "minus" p check 0 # => "zero" ``` ## 問題点 `Method#===` が `Object#===` を呼び出すことを期待しているようなコードであれば意図しない動作になる可能性があります。 ---Files-------------------------------- add_method_eqq.patch (1.06 KB) -- https://bugs.ruby-lang.org/