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

  • 4
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

普通はできない。

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.