我编写的"编程Ruby"中的method_missing

j. *_*rks 2 ruby method-missing

method_missing的

*obj.method_missing(符号h,args i)→other_obj

当obj被发送一个它无法处理的消息时,由Ruby调用.symbol是被调用方法的符号,args是传递给它的任何参数.下面的示例创建一个类Roman,它响应名称由罗马数字组成的方法,返回相应的整数值.method_missing的更典型用法是实现代理,委托和转发器.

class Roman
  def roman_to_int(str)
    # ...
  end
  def method_missing(method_id)
    str = method_id.id2name
    roman_to_int(str)
  end
end
r = Roman.new
r.iv ! 4
r.xxiii ! 23
r.mm ! 2000
Run Code Online (Sandbox Code Playgroud)

我刚刚听说方法缺失,并在Ruby编程中找到了更多信息,但本书引用的上述解释是我的头脑.有没有人有更简单的解释?更具体地说,方法缺失仅由解释器使用,或者是否需要直接在程序中调用它(假设我只是编写Web应用程序,而不是为NASA编写代码)?

Sam*_*uel 12

最好不要将ruby视为有方法.当您调用ruby"方法"时,实际上是向该实例(或类)发送消息,如果已为该消息定义了处理程序,则它将用于处理和返回值.

因此method_missing,只要ruby找不到合适的处理程序,就会调用一个特殊的定义.您也可以将其视为一种*方法.


Bri*_*ian 5

对于与任何方法都不匹配的消息,它基本上是一个全能.它广泛用于动态查找器的活动记录中.这是让你写这样的东西:

SomeModel.find_by_name_and_number(a_name, a_number)
Run Code Online (Sandbox Code Playgroud)

该模型不包含该find_by的代码,因此调用method_missing时会看到 - 我识别该格式并执行它.如果没有,那么你会得到一个找不到方法的错误.


Don*_*rve 5

Ruby没有任何类型的力度,也没有做任何检查,以什么方法的对象具有当脚本首先分析,因为这可以动态地改变应用程序运行.

method_missing的作用是拦截和处理对给定对象不存在的方法的调用.这提供了几乎所有用Ruby编写的DSL(特定于域的语言)背后的功能.

在示例的情况下,'r.iv','r.mm'等中的每一个实际上都是对Roman对象的方法调用.当然,它没有'iv'或'mm'方法,因此控制权被传递给method_missing,它获取被调用方法的名称,以及传递的任何参数.

method_missing然后将方法名称从符号转换为字符串,并将其解析为罗马数字,并将输出作为整数返回.