我正在尝试一些Ruby元编程,并且在使用instance_eval()时有些困惑。
请看以下示例:
@instance_var = 'instance_var'
local_var = 'local_var'
obj = Object.new
obj.instance_eval { p @instance_var; p local_var }
obj.instance_eval { @instance_var = 'instance_var_in_obj'; local_var = 'local_var_in_obj' }
p @instance_var; p local_var
我希望@instance_var和local_var两者都可以在代码块中传递或修改,但是我得到了以下结果:
nil
"local_var"
"instance_var"
"local_var_in_obj"
作为结果,我们可以在 instance_val 中分享(传递/修改)本地变量,但是实例变量属于 self 不能共享。
关于 instance_exec:
obj.instance_exec(@instance_var) {|instance_var| p instance_var; instance_var = @instance_var }
=> "instance_var"
@instance_var
=> "instance_var"
现在我可以传递我的外部实例变量,但仍然无法修改它。
@instance_arr = []
obj.instance_exec(@instance_arr) {|instance_arr| instance_arr << 'in_block' }
@instance_arr
=> ["in_block"]
obj.instance_exec(@instance_arr) {|instance_arr| instance_arr = [] }
@instance_arr
=> ["in_block"]
使用数组实例变量可以修改实例变量,但仅限于当前数组对象。
总之,应该使用带有局部变量而非实例变量的instance_eval
或instance_exec
方法?
是否有我遗漏的概念?
Object
实例,另一个是obj
。在obj.instance_eval { p @instance_var; p local_var }
块中,self
是obj
,该对象的@instance_var
尚未初始化,因此在引用时返回nil
。我不完全理解为什么局部变量会被区别对待,但我怀疑这与引用已初始化的局部变量会引发异常有关。 - Cary Swoveland@instance_var
,@
表示你属于某个人,我想我可以理解这一部分。是的,我的问题的重点是“为什么局部变量被处理得不同”,或者说“局部变量”实际上属于什么,如何在作用域中思考它? - Arthur H