Project

General

Profile

Actions

Feature #14142

closed

Add Method#===

Added by osyo (manga osyo) over 6 years ago. Updated over 6 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-dev:50329]

Description

概要

Ruby の Method クラスに対する提案になります。
初めてこちらを利用するので内容や書き方などに対する問題があれば教えていただけると助かります。

提案

Method#call と同等の Method#=== を定義する。

理由

Proc では Proc#===Proc#call の同等のメソッドとして定義されています。
MethodProc のように振る舞うことを期待するのであれば、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

add_method_eqq.patch (1.06 KB) add_method_eqq.patch osyo (manga osyo), 11/29/2017 12:24 PM

Updated by MusinAR (Amir Musin) over 6 years ago

  • File Выделение_008.png added

Updated by MusinAR (Amir Musin) over 6 years ago

  • File test.png added
Actions #3

Updated by MusinAR (Amir Musin) over 6 years ago

  • File deleted (test.png)
Actions #4

Updated by MusinAR (Amir Musin) over 6 years ago

  • File deleted (Выделение_008.png)

Updated by MusinAR (Amir Musin) over 6 years ago

  • File Выделение_008.png added
Actions #6

Updated by MusinAR (Amir Musin) over 6 years ago

  • File deleted (Выделение_008.png)

Updated by aycabta (aycabta .) over 6 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#=== を入れたほうがいい理由はいくらでもありそうに思います。

Actions #9

Updated by Anonymous over 6 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) over 6 years ago

返信が遅れてしまいましたが、ありがとうございました。

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0