2016-02-03 45 views
-1

我正在寻找一个解释,为什么这个工程:红宝石添加/总和变量

def somesum 
    x = 0 
    (1..10).each do |number| 
    x += number 
    end 
    puts x 
end 

,而这不工作(对于无类未定义的方法“+”):

def somesum 
    (1..10).each do |number| 
    x += number 
    end 
    puts x 
end 

同样没有这样的:

def somesum 
    (1..10).each do |number, x| 
    x += number 
    end 
    puts x 
end 
+1

你的代码段是不完整的:它们含有'def'和'do',但只有一个' end'。目前还不清楚是否将x放在循环内或外部。 – Stefan

+1

如果缺少'x = 0',那么对'x + = 1'的期望是什么? –

回答

3

为什么你的第一个例子作品的区别,是因为你初始化X:

x = 0 

,而最后两例尝试加1到零在第一循环,这是不行的,因为无有没有方法'+'。 请考虑一下,您的示例是实现目标的不好实现。 更好的解决方案是使用累加器方法。例如Enumerable#inject

(1..10).inject(0){ |sum, number| sum += number } 

甚至更​​好:

(1..10).inject(:+) 

含蓄地积累。

Enumerable#reduce的工作原理相同:

(1..10).reduce(:+) 

为了更好的理解,请阅读Iterators: inject and reject

+0

或'(1..10).sum'(问题最初是用[tag:ruby-on-rails-4]标记的) – Stefan

+0

对不起。它仅用Ruby标记。这些例子只有Ruby,似乎与Rails没有任何关系。 –

+0

其实,OP标签的rails和@YuHao删除了rails标签,这会使'.sum'有效。无论哪种方式,很好的答案。 –

1

x没有值的第二和第三例子。记住:

x += number 

是缩短:

x = x + number 

所以你在做:

x = nil + number 

和nil没有:+方法。