method_missing中的attr_accessor

时间:2012-03-09 06:02:46

标签: ruby metaprogramming

我是Ruby的新手,现在正试图了解元编程的一些内容。 我想返回错过的方法名称:

class Numeric

  attr_accessor :method_name

  def method_missing(method_id)
    method_name = method_id.to_s
    self
  end

  def name
    method_name
  end

end

10.new_method.name #this should return new_method, but returns nil

1 个答案:

答案 0 :(得分:3)

method_missing内,method_name被解释为局部变量,而不是您期望的method_missing= mutator方法。如果您明确添加接收器,那么您将得到您想要的:

def method_missing(method_id)
  self.method_name = method_id.to_s
  self
end

或者,您可以分配给@method_name实例变量:

def method_missing(method_id)
  @method_name = method_id.to_s
  self
end

attr_accessor宏只为您添加了两种方法,因此attr_accessor :p是此简写:

def p
    @p
end
def p=(v)
    @p = v
end

您可以根据需要随意使用基础实例变量。