Posted at

Rubyで名前の末尾以外に!や?を持つメソッドを定義したり呼び出したりする

More than 5 years have passed since last update.

普通はできない。

def a!b  # def a!(b) と解釈される

"a!b"
end

def a?b # def a?(b) と解釈される
"a?b"
end

a!b # a!(b)と解釈される
a?b # a?(b)と解釈される

以下のようにする。

define_method(:'a!b'){"a!b"}

define_method(:'a?b'){"a?b"}

p send(:'a!b') #=> "a!b"
p send(:'a?b') #=> "a?b"

このように、名前の末尾以外に!?を持つメソッドは通常の方法では定義や呼び出しができないので、任意の文字列などから新しいメソッドを作ったりする場合には注意が必要。たとえばActiveSupportのalias_method_chainfoo!bar?のようなメソッド名が渡されると、foo!_without_featurebar?_without_featureではなく、foo_without_feature!bar_without_feature?ようなメソッドを定義するようになっている。




CC0



To the extent possible under law,

vzvu3k6k

has waived all copyright and related or neighboring rights to
this work.