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

标签 ruby variables hash methods scalar

我只是想理解以下代码中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/

相关文章:

ruby-on-rails - 如何为开发和生产指定不同版本的 gem

持有变量的 JavaScript 计算

javascript - 在对象中保存 DOM 元素的有效方法

java - 哪个 SHA-256 是正确的? Java SHA-256 摘要或 Linux 命令行工具

data-structures - Redis 哈希 : How to Query on both Key and Value

ruby-on-rails - Ruby on Rails 路由别名

ruby-on-rails - 添加 www.总体设计电子邮件或 Rails?

ruby - rails环境加载缓慢

excel - 在 Excel 中使用 "variable"

c++ - 仅匹配集合中的某些字段