我正在尝试一些 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"
现在我可以传递我的外部实例 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
使用本地变量而不是实例变量?
我错过了一些概念吗?