Project

General

Profile

Actions

Feature #14223

closed

Refinements で定義した #to_proc が &hoge 時に呼ばれないのを緩和する提案

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

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

Description

Refinements に関する提案です。
現行の仕様では Refinements で定義された #to_proc&hoge 時に暗黙的に呼びだされません。

using Module.new {
	refine String do
		def to_proc
			proc { |it| it.send self }
		end

		def refine_method
			"X#refine_method"
		end
	end
}

def func &block
end

p "upcase".refine_method
# => "X#refine_method"

p "upcase".to_proc.call "homu"
# => "HOMU"

# Error: wrong argument type X (expected Proc) (TypeError)
func &"upcase"

実行結果:https://wandbox.org/permlink/j8Hhavy7LoKYjrnz

最近の傾向として Kernel#send や式展開時の #to_s などで Refinements が有効になっています。
そういう意味では &hoge で暗黙的に呼び出される #to_proc も Refinements が有効になってもよいのではないでしょうか。
この件に関して、他の方の意見を聞かせていただけると助かります。
また、自分で実装を書いてみたのですが『とりあえず動いている』というレベルなので、Refinements の実装に詳しい方がいればパッチもみていただけると助かります。


Files

refinemetns_to_proc.patch (3.73 KB) refinemetns_to_proc.patch osyo (manga osyo), 12/22/2017 04:44 PM
refinemetns_to_proc.patch (3.26 KB) refinemetns_to_proc.patch osyo (manga osyo), 12/29/2017 06:45 AM
Actions #1

Updated by osyo (manga osyo) about 6 years ago

  • Description updated (diff)

Updated by nobu (Nobuyoshi Nakada) about 6 years ago

賛成です。

できれば不要なインデントの変更などは混ぜないでください。

Updated by osyo (manga osyo) about 6 years ago

nobu (Nobuyoshi Nakada) wrote:

賛成です。

返信して頂き、ありがとうございます。

できれば不要なインデントの変更などは混ぜないでください。

ありがとうございます。修正しました。
これで問題ないでしょうか。

Updated by matz (Yukihiro Matsumoto) about 6 years ago

良さそうに思えます。取り込んでみましょう。

Matz.

Actions #5

Updated by nobu (Nobuyoshi Nakada) about 6 years ago

  • Status changed from Open to Closed

Applied in changeset trunk|r62020.


vm_args.c: to_proc refinements

  • vm_args.c (vm_to_proc): enable #to_proc by refinements at Proc
    passing as a block. patched by osyo (manga osyo).
    [Feature #14223]

Updated by osyo (manga osyo) about 6 years ago

ありがとうございます!

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0