Вы можете использовать Kernel#__method__
, который возвращает имя текущего метода как Symbol
.В отличие от super
это не ключевое слово, а обычный метод, поэтому вы должны передать его в метод send
вместе с необходимыми аргументами для вызова метода.
Вот что возвращает __method__
:
obj = Object.new
def obj.foo
p __method__
end
obj.foo
# => :foo
А вот пример метода класса, который динамически определяет факторные методы:
class Foo
def self.define_fact(method_name)
define_method(method_name) do |n|
n > 0 ? n * send(__method__, n - 1) : 1
end
end
end
f = Foo.new
# puts f.fact(5)
# => undefined method `fact' for #<Foo:0x8ede45c> (NoMethodError)
Foo.define_fact :fact
puts f.fact(5)
# => 120
Без __method__
Я не могу придумать ни одного решения, которое не включало бы какое-тоeval
этого лучше избегать, если это возможно.