gpt4 book ai didi

ruby - 为什么 += 将其操作的变量的值重置为 nil?

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:58 24 4
gpt4 key购买 nike

以这段代码为例:

class Thing
attr_accessor :options, :list

def initialize
@list = []
@options = { published_at_end: 'NOW', published_at_start: 'NOW-2DAYS' }
end

def run
# If you replace this comment with a debugger, the value of list is nil
list += _some_method(options)
return list
end

private

def _some_method(options)
[options[:published_at_start], 1, 2, 3, 4, options[:published_at_end]]
end
end

如果您将其复制/粘贴到 irb,然后运行:

  • t = Thing.new
  • t.run

它会输出这个错误:

NoMethodError: undefined method `+' for nil:NilClass

如果删除 +=行(只留下 return 行),它返回 [] ... 所以据我所知,这只是 += 的存在设置 listnil .我也觉得有趣的是它的值(value)是nil+= 行中调用(请参阅我在代码示例中的评论)。

或者,如果您使用 <<flatten相反,您会得到预期的结果:

class Thing
attr_accessor :options, :list

def initialize
@list = []
@options = { published_at_end: 'NOW', published_at_start: 'NOW-2DAYS' }
end

def run
list << _some_method(options)
list.flatten
end

private

def _some_method(options)
[options[:published_at_start], 1, 2, 3, 4, options[:published_at_end]]
end
end

如果您将其复制/粘贴到 irb,然后运行:

  • t = Thing.new
  • t.run

它将输出['NOW-2DAYS', 1, 2, 3, 4, 'NOW'] .


为什么 +=重置 list 的值至 nil ?此外,它如何将其值设置为 nil+= 之前被召唤?

半相关/有用的旁注 - 我将使用铲子 ( << ) 和 flatten因为performance reasons ,但我仍然对为什么变量被重置为 nil 感兴趣.

最佳答案

list += [1, 2, 3] 等同于:

list = list + [1, 2, 3]

因为这是一个 assignment , Ruby 创建一个新的局部变量 list,隐藏你的list 方法。来自文档:

When using method assignment you must always have a receiver. If you do not have a receiver, Ruby assumes you are assigning to a local variable

更具体地说,局部变量list是在解析器遇到list =时创建的。与未初始化的实例变量和全局变量一样,它的值为 nil。因此,尝试评估赋值的右侧 list + [1, 2, 3] 失败,因为它等同于:

nil + [1, 2, 3]
# NoMethodError: undefined method `+' for nil:NilClass

所以为了得到预期的结果,你必须提供一个显式的接收者:

self.list += [1, 2, 3]

或者直接赋值给实例变量:

@list += [1, 2, 3]

或者使用修改接收者的方法:

list.concat [1, 2, 3]

关于ruby - 为什么 += 将其操作的变量的值重置为 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41145121/

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