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

she*_*edd 3 ruby variables scope ruby-on-rails

我对使用Ruby变量范围的最佳实践有疑问class_eval.

在此代码中,在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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)
  1. 这种情况的最佳做法是什么?我意识到全局变量对于这种情况来说是一个糟糕的选择,因为结果的范围很广,但类似的变量同样不受欢迎?
  2. 除了处理变量范围之外,还有其他方法可以解决这些变量的可访问性class_eval吗?

Adr*_*ian 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
Run Code Online (Sandbox Code Playgroud)