我想到的一个问题是,如果尚未解释定义,Ruby解释器如何知道对象上存在方法?比如,首先定义方法而不是使用它,而不是使用它然后定义它不重要吗?
答案 0 :(得分:5)
它不知道,也不关心 - 直到执行。当执行方法调用语句时,解释器会查看类(对象,而不是代码!)是否具有命名函数。如果没有,它会查找祖先树。如果找不到,则调用method_missing
方法。如果没有定义,则会出现错误。
如果您的函数调用未执行,则不会出现任何错误。
答案 1 :(得分:3)
解释器提前不知道未定义的方法,例如:
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)
“缺少方法”用于活动记录查找方法和其他可能有“动态定义”功能的地方。
答案 2 :(得分:1)
问题是,解释器试图在你使用时找到它,并且由于它不存在,它可能会失败。
在(某些)编译语言中,没关系,因为在编译时,编译器可能会说“我会在第二次通过时查找”,但我不认为这是Ruby的情况。 / p>