Интерпретатор не знает о неопределенных методах заранее, например:
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)
«Метод отсутствует» используется такими вещами, как методы поиска активной записи и в других местах, где может иметь смысл иметь «динамически определенные» функции.