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"]
配列のインスタンス var を使用すると、インスタンス var を変更できますが、現在の配列オブジェクト内でのみ変更できます
要約プレイでinstance_eval
、またはinstance_exec
インスタンス変数ではなくローカル変数を使用しますか?
私が見逃したいくつかの概念はありますか?