2016-02-03 46 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沒有:+方法。