处理未定义方法的调用

当 Ruby 尝试执行未定义的方法时(或者,在 OOP 术语中,当一个对象被发送了一个它无法处理的消息时),该错误会导致程序终止退出。你可能更愿意你的程序能从这样的错误中恢复。你可以通过编写一个名为 method_missing 的方法来完成此操作,该方法接收一个值为缺失的方法名称的参数。这将在调用不存在的方法时执行:

nomethod1.rb
  1. def method_missing( methodname )
  2. puts( "#{methodname} does not exist" )
  3. end
  4. xxx #=> displays: "xxx does not exist"

method_missing 方法还可以在缺失的方法名称后获取传入的参数列表(args):

nomethod2.rb
  1. def method_missing( methodname, *args )
  2. puts( "Class #{self.class} does not understand: #{methodname}( #{args.inspect} )" )
  3. end

method_missing 方法甚至可以动态创建未定义的方法:

  1. def method_missing( methodname, *args )
  2. self.class.send( :define_method, methodname, lambda{ |*args| puts( args.inspect) } )
  3. end