Когда Ruby узнает, что метод существует? - PullRequest
0 голосов
/ 22 февраля 2011

Один вопрос, который возник у меня в голове, заключался в том, как интерпретатор Ruby узнает, что метод существует на объекте, если определение еще предстоит интерпретировать? Например, не имеет ли значения, определите ли вы сначала метод, а не его, а не затем определите его?

Ответы [ 3 ]

5 голосов
/ 22 февраля 2011

Он не знает и ему все равно - до казни.Когда выполняется оператор вызова метода, интерпретатор проверяет, имеет ли класс (объект, а не код!) Именованную функцию.Если это не так, он ищет дерево предков.Если он не находит ничего, он вызывает метод method_missing.Если это не определено, вы получите ошибку.

Если ваш вызов функции не будет выполнен, вы не получите никаких ошибок.

3 голосов
/ 22 февраля 2011

Интерпретатор не знает о неопределенных методах заранее, например:

o = Object.new
o.foo # => Raises NoMethodError.
class Object
  def foo
    puts "Foo!"
  end
end
o.foo # => prints "Foo!", since the method is defined.

Однако в Ruby есть удобная функция, называемая method_missing, которая позволяет получателю вызова метода принимать имя метода и аргументы в качестве отдельных аргументов и обрабатывать их соответствующим образом, если никакой определенный метод уже не обрабатывает вызов.

def o.method_missing(sym, *args)
  puts "OK: #{sym}(#{args.inspect})"
  # Do something depending on the value of 'sym' and args...
end
o.bar(1, 2, 3) #=> OK: bar(1, 2, 3)

«Метод отсутствует» используется такими вещами, как методы поиска активной записи и в других местах, где может иметь смысл иметь «динамически определенные» функции.

1 голос
/ 22 февраля 2011

Проблема в том, что интерпретатор пытался найти его, когда вы его используете, и, поскольку его там не будет, он может потерпеть неудачу.

В (некоторых) скомпилированных языках это не имеет значения, потому что во время компиляции компилятор может сказать «я поищу это на втором проходе», но я не думаю, что это имеет место срубин.

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