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)
class_eval
吗?问题不是因为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)