理解这个片段'D'*(num%1000/500)

时间:2016-01-05 14:11:47

标签: ruby

任何人都可以解释如何阅读此代码以及它将做什么?

'D' * (num % 1000 / 500)

它是从将整数转换为罗马数字的方法。我不明白它是如何运作的。

5 个答案:

答案 0 :(得分:3)

确实很混乱。我想这个想法是将一个或零 D s取决于你是否得到一个大于500的数字后得到除数的余数为1000.

操作顺序:

num % 1000

num模数1000.将保留最后三位数字。

/ 500

将查看最后三位数字是否大于500。

String#*重复一个字符串:

'x' * 5 # => "xxxxx"

<小时/> 需要的原因是因为D是500的字母。您将只有一个或零,因为M是1000的字母。

< / p>

答案 1 :(得分:3)

表达式(num%1000/500)表示&#34;如果您的最后3位数字大于500,则评估为1,否则评估为0&#34;

&#34; d&#34; *(0或1)决定是否放入&#34; D&#34;罗马数字与否。

答案 2 :(得分:3)

它的作用

表达式是一种构建罗马数字五百位数字的方法,即'D'。

它取任何数字,仅提取最右边的三个数字(值0到999),如果值为500或更大,则仅返回'D' 。否则返回空字符串''

如何阅读

在Ruby中,乘法*,除/和模%符号具有相同的优先级,并按从左到右的顺序处理。但是,括号的优先级高于这三个​​运算符。

为了帮助可视化处理顺序,您可以添加可选括号:

'D' * ( ( num % 1000 ) / 500 )
  1. num%1000:
    • 提取数字的最右边三位数,得到值0 - 999
  2. {0-999} / 500:
    • 确定值是否为500或更大。
    • 如果是,则返回1,否则返回0。
    • 在Ruby中,整数除法不会自动转换为小数。
  3. 'D'* {1或0}:
  4. <强>实施例

    号码35,045:

    35045 % 1000  #=> 45
    45 / 500      #=> 0
    'D' * 0       #=> ""
    

    编号为468,987:

    468987 % 1000 #=> 987
    987 / 500     #=> 1
    'D' * 1       #=> "D"
    

    对于数字670:

    670 % 1000    #=> 670
    670 / 500     #=> 1
    'D' * 1       #=> "D"
    

    对于数字7:

    7 % 1000      #=> 7
    7 / 500       #=> 0
    'D' * 0       #=> ""
    

答案 3 :(得分:0)

请参阅this页面并向下滚动到Ruby Operators Precedence。

乘法,除法和模运算都在一起,因此优先权是从左到右的IIRC。

首先,评估num % 1000。然后,除以500。然后乘以'D'。

答案 4 :(得分:0)

模数%和除/运算符具有相同的优先级。

所以关联性,从左到右为这些运营商发挥作用。

因此,表达式相当于'D' * ((num % 1000) / 500):您正在乘以“D&#39; D&#39;由num的最后3位数除以500。

相关问题