gpt4 book ai didi

ruby - 解释 ruby​​ 中具有相同名称和其他属性的方法和变量的行为

转载 作者:数据小太阳 更新时间:2023-10-29 08:00:50 25 4
gpt4 key购买 nike

我只是想理解以下代码中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 不会导致 confnil

另一个相关的片段,这次是标量而不是散列:

    def foo
@foo ||= "bar"
end

def destroyfoo
foo = nil
end

def changefoo
foo = "baz"
end

同时调用 changefoodestroyfoo 时的结果:

    destroyfoo
puts foo
# "bar"

...

    changefoo
puts foo
# "bar"

任何关于可能发生的事情的指示在这两种情况下都会有用。

最佳答案

您的destroydestroyfoochangefoo 方法都只是分配给一个局部变量,不会调用访问器方法.

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com