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(:+)