Марк хорошо объяснил, где была ошибка в вашем коде.Однако такая ошибка никогда не должна была возникать в первую очередь, поскольку в Ruby все коллекции уже знают, как перебирать себя: вам не нужно это делать, поэтому вы даже никогда не сможете сделать такую ошибку!
Вот пример того, как можно реализовать тот же алгоритм в более идиоматическом Ruby:
numerals = {
'M' => 1000,
'D' => 500,
'C' => 100,
'L' => 50,
'X' => 10,
'V' => 5,
'I' => 1
}
num = 'MCMXCIX'
(num.chars.map(&numerals.method(:[])) << 0).each_cons(2).inject(0) {|a, (n1, n2)|
if n1 < n2 then a - n1 else a + n1 end
}
Видите?Нет петель.Нет индексов.Вы не можете сделать ошибку «один за другим», даже если вы пытались !
Бонус: на самом деле , приведенный выше фрагмент содержит частькода, чтобы предотвратить ошибочную ошибку, хотя и на гораздо более высоком семантическом уровне.Вы можете найти это?