class_eval的类级变量的替代方法?

时间:2010-07-02 17:28:47

标签: ruby-on-rails ruby variables scope

我对使用class_eval的Ruby变量范围的最佳实践提出了疑问。

在此代码中,在class_eval块中,第一个和第二个局部变量未定义。

def parent_method(opts={})
first = opts[:percent]
second = (10 * first).to_i

SecondClass.class_eval do 
  def second_method; return {:a => first, :b => second}; end; 
end   
end

这似乎是一个范围问题,因为我发现让它工作的唯一方法是制作第一和第二类级变量:

def parent_method(opts={})
@@first = opts[:percent]
@@second = (10 * @@first).to_i

SecondClass.class_eval do 
  def second_method; return {:a => @@first, :b => @@second}; end; 
end   
end
  1. 此方案的最佳做法是什么?我意识到全局变量对于这种情况来说是一个糟糕的选择,因为结果的范围很广,但类似的变量同样不受欢迎?
  2. 除了处理变量范围外,还有其他方法可以解决class_eval内这些变量的可访问性吗?

1 个答案:

答案 0 :(得分:5)

问题不在于class_eval,而在于def。当您以这种方式定义方法时,它会引入一个新范围。以下是解决问题的最佳方法:

def parent_method(opts={})
    first = opts[:percent]
    second = (10 * first).to_i

    SecondClass.class_eval do 
      define_method(:second_method) { return {:a => first, :b => second} }
    end     
end