2011-12-22 2 views
2

Это моя функцияМожет ли кто-нибудь уточнить, почему значение переменной в моем цикле не обновляется до тех пор, пока цикл не будет закрыт?

def rating(array) 
    sum_count = array.values.inject(0) { |sum_count,value| sum_count + value } 
    run_count = 0 
    array.each do |tag,count| 
    run_count += count 
    cum_distn = run_count/sum_count 
    logger.debug "cum_distn is #{cum_distn.to_f}; run_count is #{run_count.to_f}; sum_count is #{sum_count}" 
    if cum_distn < 0.25 
     ... 
    elsif cum_distn < 0.5 
     ... 
    else 
     ... 
    end 
    end 
end 

Для 2-х объектов в моем массиве с отсчетами 1 каждый мой регистратор показывает это:

cum_distn is 0.0; run_count is 1.0; sum_count is 2 
cum_distn is 1.0; run_count is 2.0; sum_count is 2 

кажется, что значение cum_distn только обновляя когда-то один цикл завершен, пока я намереваюсь его обновить сразу перед открытием функции if. У меня есть два вопроса:

(a) Почему это происходит (поскольку я не вижу никакого логического объяснения)?

(b) Как я могу исправить это, чтобы делать то, что хочу?

+0

еще не закончил читать ваш вопрос, но вы должны заменить 'def rating (array)' by 'def rating (hash)' потому что 'hash.values' имеет больше смысла, чем' array.values' ... – Damien

ответ

3

Вы используете целочисленное деление, поэтому результат run_count/sum_count усекается. Чтобы исправить, просто преобразуйте один из них в Float перед вычислением cum_distn. Например:

cum_distn = run_count.to_f/sum_count 
+0

ошибка моего rookie. спасибо большое –

2

1) Это происходит потому, что 3/2 #=> 1 но 3.0/2 # => 1.5. Другими словами, integer/integer #=> integer и float/integer #=> float

2) Просто позвоните to_f один раз, в начале (не в цикле, потому что это на самом деле не производительный):

def rating(hash) 
    sum_count = hash.values.inject(:+).to_f 
    hash.inject(0) do |run_count, (tag, count)| 
    run_count += count 
    cum_dist = run_count/sum_count 
    logger.debug "cum_distn is #{cum_distn}; run_count is #{run_count}; sum_count is #{sum_count}" 
    ... 
    run_count # return run_count 
    end 
end 
+0

спасибо за подробное объяснение –

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

  • Нет связанных вопросов^_^