处理未定义方法的调用
当 Ruby 尝试执行未定义的方法时(或者,在 OOP 术语中,当一个对象被发送了一个它无法处理的消息时),该错误会导致程序终止退出。你可能更愿意你的程序能从这样的错误中恢复。你可以通过编写一个名为 method_missing
的方法来完成此操作,该方法接收一个值为缺失的方法名称的参数。这将在调用不存在的方法时执行:
nomethod1.rb
def method_missing( methodname )
puts( "#{methodname} does not exist" )
end
xxx #=> displays: "xxx does not exist"
method_missing
方法还可以在缺失的方法名称后获取传入的参数列表(args
):
nomethod2.rb
def method_missing( methodname, *args )
puts( "Class #{self.class} does not understand: #{methodname}( #{args.inspect} )" )
end
method_missing
方法甚至可以动态创建未定义的方法:
def method_missing( methodname, *args )
self.class.send( :define_method, methodname, lambda{ |*args| puts( args.inspect) } )
end