2016-02-03 8 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'. Неясно, находится ли 'puts x' внутри цикла или снаружи. – Stefan

+1

Если 'x = 0' отсутствует, что вы ожидаете от' x + = 1'? –

ответ

3

Разница, почему ваш первый пример работает, потому что вы инициализирован х:

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' (вопрос был первоначально помечен тегом: ruby-on-rails-4] – Stefan

+0

Извините. Он помечен только Ruby. Примеры только Ruby и, похоже, никак не связаны с Rails. –

+0

На самом деле, OP tagged rails и @YuHao удалили тег rails, что сделало бы '.sum' действительным. В любом случае, хороший ответ. –

1

Во втором и третьем примерах x не имеет значения. Помните, что:

x += number 

является укорочение для:

x = x + number 

так что вы делаете:

x = nil + number 

и ноль не имеет :+ метод.

Смежные вопросы