2012-08-01 110 views
1

我正在编码卡塔罗马数字定义here。虽然我已经完成并没有卡住,但确实有一个问题,我需要帮助解答。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 

它返回五,这是有道理的,因为

5.divmod(5) => 1, 0 

但是这段代码如何不与

5.divmod(1) => 5, 0 

那么它是如何返回V而不是IIIII,因为它只是追加键(I)次count(5)。不知何故,它显然正确地返回V而不是IIIII,但我不知道该逻辑在哪里。任何帮助将不胜感激。谢谢

回答

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'。

+0

啊是的,它永远不会重置号码。出于某种原因,我没有考虑到这一点,我应该想到这一点。是的这个代码是不完整的任何手段。这是一个演示测试驱动开发与红色绿色循环的卡塔,只是做基本的事情来让测试通过。所以这个只做1-8。 – ruevaughn 2012-08-01 19:28:07

相关问题