我对使用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
class_eval
内这些变量的可访问性吗?答案 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