Ruby - divmod возвращает правильное значение, но я не понимаю, почему

Я работаю над кодированием ката римскими цифрами, определенными здесь. Хотя я закончил его и не застрял, у меня есть вопрос, на который мне нужна помощь.

Вот где мой вопрос сидит:

class Fixnum
  NUMERALS = [
    ['V', 5], ['IV', 4], ['I', 1]
  ]
  def to_roman
    roman = ""
    number = self
    for key, value in NUMERALS
      count, number = number.divmod(value)
      roman << (key * count)
    end
    roman
  end
end

Когда я запускаю divmod, говорю цифру 5, вот так

5.to_roman

Он возвращает V. И это имеет смысл, потому что

5.divmod(5) => 1, 0

Но как этот код выше не делает то же самое с

5.divmod(1) => 5, 0

Так как же он возвращает V, а не IIIIII, поскольку он просто добавляет ключ (I) раз (5). Каким-то образом он явно правильно возвращает V вместо IIIIII, но я не уверен, где эта логика. Любая помощь будет принята с благодарностью. Спасибо


person ruevaughn    schedule 01.08.2012    source источник


Ответы (1)


Ваш код никогда не выполняет 5.divmod(1). При первом выполнении цикла key равно 'V', а value равно 5. Затем выполняется 5.divmod(5), а затем number == 0. Таким образом, на следующей итерации цикла, когда key равно 'IV', а value равно 4, выполняется 0.divmod(4), в результате получается count == 0, и к строке ничего не добавляется.

Но этот код странный, потому что 9.to_roman возвращает 'VIV'.

person Confusion    schedule 01.08.2012
comment
Ах да, он никогда не сбрасывает номер. Я почему-то не учел этого, мне следовало подумать об этом. да, этот код никоим образом не завершен. Это ката — продемонстрировать разработку через тестирование с помощью красно-зеленого цикла, выполняя только основные действия, чтобы пройти тесты. Так что этот только делает 1-8. - person ruevaughn; 01.08.2012