Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 理解此代码段“D”*(数值%1000/500)_Ruby - Fatal编程技术网

Ruby 理解此代码段“D”*(数值%1000/500)

Ruby 理解此代码段“D”*(数值%1000/500),ruby,Ruby,有人能解释一下如何阅读这段代码以及它会做什么吗 'D' * (num % 1000 / 500) 它来自一种将整数转换为罗马数字的方法。我不明白它是如何工作的。它确实很模糊。我猜这个想法是把一个或零的Ds,取决于你在得到除1000的余数后,得到的数字是否大于500 操作顺序: num % 1000 模1000的数值。将保留最后三位数字 / 500 将查看最后三位数字是否大于500 重复一个字符串: 'x' * 5 # => "xxxxx" 之所以需要,是因为D是500的字母。您将

有人能解释一下如何阅读这段代码以及它会做什么吗

'D' * (num % 1000 / 500)

它来自一种将整数转换为罗马数字的方法。我不明白它是如何工作的。

它确实很模糊。我猜这个想法是把一个或零的Ds,取决于你在得到除1000的余数后,得到的数字是否大于500

操作顺序:

num % 1000
模1000的数值。将保留最后三位数字

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

重复一个字符串:

'x' * 5 # => "xxxxx"
之所以需要,是因为D是500的字母。您将只有一个或零个,因为M是1000的字母。

请参阅第页并向下滚动到Ruby运算符

乘法、除法和模运算都在一起,所以优先级是从左到右的IIRC

首先,计算num%1000。然后,除以500。然后乘以“D”。

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

因此,这些操作符从左到右的结合性开始发挥作用


因此,表达式相当于“D”*num%1000/500:将“D”乘以num的最后3位数除以500。

表达式num%1000/500表示如果最后3位数中的数字大于500,则计算为1,否则计算为0

D*0或1决定是否在罗马数字上加D。

它的作用

该表达式是一种构建罗马数字500位的方法,即“D”

它接受任何数字,仅提取最右边的三个数字值0到999,并且仅当值为500或更大时才返回“D”。否则它将返回一个空字符串

怎么读

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

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

'D' * ( ( num % 1000 ) / 500 )
数量%1000: 提取数字最右边的三位数字,得到值0-999 {0-999} / 500: 确定值是否为500或更大。 如果是,则返回1;如果不是,则返回0。 在Ruby中,整数除法不会自动转换为小数。 'D'*{1或0}: 在Ruby中,乘1返回字符串,乘0返回空字符串 例子

对于编号35045:

35045 % 1000  #=> 45
45 / 500      #=> 0
'D' * 0       #=> ""
对于号码468987:

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       #=> ""

将代码放入问题正文中。“D”*num%1000/500的哪个部分你不明白?num是什么。。。。。。。。。。。。。。。。。另一种表达方式是num%1000<500?:'既然罗马数字的值高达5000,我们可以创建一个所有可能的罗马数字的散列并使用它进行转换吗?