Ruby add/sum变量
我正在寻找一个解释,解释为什么这样做有效:Ruby add/sum变量,ruby,Ruby,我正在寻找一个解释,解释为什么这样做有效: def somesum x = 0 (1..10).each do |number| x += number end puts x end 但这不起作用(对于nil类,未定义的方法“+”): 这也不是: def somesum (1..10).each do |number, x| x += number end puts x end 在第二个和第三个示例中,x没有值。记住: x += number
def somesum
x = 0
(1..10).each do |number|
x += number
end
puts x
end
但这不起作用(对于nil类,未定义的方法“+”):
这也不是:
def somesum
(1..10).each do |number, x|
x += number
end
puts x
end
在第二个和第三个示例中,
x
没有值。记住:
x += number
是对以下内容的缩写:
x = x + number
所以你在做:
x = nil + number
nil没有
:+
方法。第一个示例之所以有效,是因为您初始化了x:
x = 0
而最后两个示例尝试在第一个循环中将1添加到nil,这不起作用,因为nil没有方法“+”。
请注意,您的示例是实现目标的糟糕实现。
更好的解决方案是使用累加器方法。例如:
或者更好:
(1..10).inject(:+)
这意味着积累
工作原理相同:
(1..10).reduce(:+)
为了更好地理解,请阅读您的代码片段不完整:它们包含一个
def
和一个do
,但只有一个end
。尚不清楚放置x
是在循环内还是在循环外。如果缺少x=0
,您对x+=1
?或(1..10)有何期望。sum
(问题最初被标记为)抱歉。它只带有Ruby标记。这些示例仅限于Ruby,似乎与Rails没有任何关系。实际上,OP标记了Rails,@YuHao删除了Rails标记,这将使.sum
有效。不管怎样,答案都很好。我认为inject
和reduce
是同一种方法的同义词?它们是。也许答案有点误导。我来编辑。
(1..10).inject(:+)
(1..10).reduce(:+)