Ruby: есть ли ключевое слово для вызова метода изнутри себя (аналог супер)? - PullRequest
6 голосов
/ 24 января 2012

Мне интересно: есть ли способ вызвать метод изнутри себя в Ruby, не используя его имя?

Если метод был создан с помощью некоторых методов метапрограммирования, то его вызов по имени может быть трудным для чтения. Даже для обычно определенного метода, если вы не уверены в правильности имени для него или если его имя длинное, вызывать его изнутри самого себя можно по какому-либо ключевому слову (аналогично super).

1 Ответ

11 голосов
/ 24 января 2012

Вы можете использовать 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 этого лучше избегать, если это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...