是否可以在方法缺失函数中访问实例值?

时间:2012-03-03 22:53:04

标签: ruby

当我一直遇到(编辑过的)堆栈级别太深错误时,我试图编写我的第一个method_missing覆盖。主要罪魁祸首似乎是试图利用实例属性。例如,如果'self'是User类的一个实例,那么检查类似的东西:

def method_missing(name)
  if self.name
    # do stuff
  end
end

会出现故障。我花了很长时间在这上面,但最终放弃了。必须有一些我不理解访问它的东西。

修改

道歉,安德鲁是对的,我的Stack Level太深了。考虑到这一点,访问实例属性值的适当方式(如果有的话)是什么?

1 个答案:

答案 0 :(得分:1)

您可以潜在通过确保self.name确实存在来纠正此问题:

def method_missing(name)
  if self.respond_to?(:name) && self.name
    # do stuff
  end
end

请注意,如果您的类继承自任何Railsy(例如ActiveRecord::Base),则可能无法,因为它会覆盖respond_to?

如果 在Railsy类中,您的方法丢失应该调用super,以免丢失很多“神奇”的ActiveRecord方法(可能包括self.name }本身):

def method_missing(name, *args, &block)
  if name_is_something_i_should_handle_here
    # do your stuff
  else
    super(name, *args, block) # call parent's method_missing
  end
end

显然你应该用适当的逻辑替换name_is_something_i_should_handle_here

您可能还希望考虑使用dynamic method creation instead of method_missing