【发布时间】:2017-04-29 22:22:05
【问题描述】:
以这段代码为例:
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.newt.run
它会输出这个错误:
NoMethodError: undefined method `+' for nil:NilClass
如果您删除 += 行(只留下 return 行),它会返回 []...所以据我所知,只是 += 的存在将 list 设置为nil。
我还发现它的值是 nil 在 += 调用之前的行中的 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.newt.run
它将输出['NOW-2DAYS', 1, 2, 3, 4, 'NOW']。
为什么+= 将list 的值重置为nil?
此外,在调用+= 之前,它如何将其值设置为nil?
半相关/有用的旁注 - 由于performance reasons,我将使用铲子(<<)和flatten,但我仍然对为什么变量重置为nil感兴趣。
【问题讨论】:
标签: ruby