我只是想理解以下代码中destroy
方法的行为:
更新:请注意我的意图是了解行为,而不是将 nil 分配给变量的直接解决方案。
def conf
@conf ||= { 'foo' => { 'bar' => 'baz' } }
end
def destroy
conf = nil
end
def change
conf['foo']['bar'] = 'meh'
end
def add
conf['foo']['abc'] = 'moo'
end
这是调用 add
方法的输出:
add
pp conf
# {"foo"=>{"bar"=>"baz", "abc"=>"moo"}}
改变
方法
change
pp conf
# {"foo"=>{"bar"=>"meh"}}
销毁
方法
destroy
pp conf
# {"foo"=>{"bar"=>"baz"}}
那么,为什么 destroy
不会导致 conf
有 nil
?
另一个相关的片段,这次是标量而不是散列:
def foo
@foo ||= "bar"
end
def destroyfoo
foo = nil
end
def changefoo
foo = "baz"
end
同时调用 changefoo
和 destroyfoo
时的结果:
destroyfoo
puts foo
# "bar"
...
changefoo
puts foo
# "bar"
任何关于可能发生的事情的指示在这两种情况下都会有用。
最佳答案
您的destroy
、destroyfoo
和changefoo
方法都只是分配给一个局部变量,不会调用访问器方法.
change
方法起作用的原因是因为 conf['foo']['bar'] = 'meh'
是对 conf
方法获取 @conf
,然后调用返回对象上的 []
方法,然后调用 []=
第一级散列上的方法。 add
也是如此。
这与像 conf =
此外,为了完整起见,请注意,即使您为 @conf
创建了一个 attr writer(使用 attr_writer
或通过编写 conf=
你自己的方法)那么像 conf = nil
这样的行仍然会引用一个局部变量并且不会调用你的方法。您需要使用 self.conf=
来消除歧义。
关于ruby - 解释 ruby 中具有相同名称和其他属性的方法和变量的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13628152/