任何人都可以解释如何阅读此代码以及它将做什么?
'D' * (num % 1000 / 500)
它是从将整数转换为罗马数字的方法。我不明白它是如何运作的。
答案 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 )
<强>实施例强>
号码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。