Feature #14142
closedAdd Method#===
Description
概要¶
Ruby の Method
クラスに対する提案になります。
初めてこちらを利用するので内容や書き方などに対する問題があれば教えていただけると助かります。
提案¶
Method#call
と同等の Method#===
を定義する。
理由¶
Proc
では Proc#===
が Proc#call
の同等のメソッドとして定義されています。
Method
が Proc
のように振る舞うことを期待するのであれば、Proc#===
と同等の Method#===
が定義されている方がよいのではないでしょうか。
ユースケース¶
以下のようにして Proc
と同様に when
で使用する事が出来るようになります。
# 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
Updated by MusinAR (Amir Musin) about 7 years ago
- File Выделение_008.png added
Updated by MusinAR (Amir Musin) about 7 years ago
- File test.png added
Updated by MusinAR (Amir Musin) about 7 years ago
- File deleted (
Выделение_008.png)
Updated by MusinAR (Amir Musin) about 7 years ago
- File Выделение_008.png added
Updated by MusinAR (Amir Musin) about 7 years ago
- File deleted (
Выделение_008.png)
Updated by aycabta (aycabta .) about 7 years ago
case value
when proc { |v| receiver.hoge(v) }
end
とすることもできますが、この issue にあるパッチで実現される方法のほうが Rubyish で良いと思います。
case value
when receiver.method(:hoge).to_proc
end
とすれば今でも意図と同じものは可能ですが、微妙に Proc っぽいけど Proc じゃない Method のために #to_proc を呼び出しているだけであり、これは #=== が存在すればより良くなると思います。
余談: この件は issue を立てた本人から以前より聞いていました。2 週間ほど前、シアトルに行った時に @zenspider (Ryan Davis) にこの件を相談したのですが、「Method にも #curry があってそれは Proc を返す。そういう Proc との交換可能性みたいなものも見られるのに Proc#=== があって Method#=== が無いのは確かに中途半端だね」という話をしました。確かに Method#=== を入れたほうがいい理由はいくらでもありそうに思います。
Updated by matz (Yukihiro Matsumoto) about 7 years ago
LGTM.
Matz.
Updated by Anonymous about 7 years ago
- Status changed from Open to Closed
Applied in changeset trunk|r61158.
Add Method#=== that invokes #call
Patch by osyo via [Feature #14142]
Updated by osyo (manga osyo) about 7 years ago
返信が遅れてしまいましたが、ありがとうございました。