Ruby 使用下划线转换整数是否会引发无声错误?
今天早些时候我在做一个练习,它涉及到对给定整数中的所有数字求和。其中一个数字有下划线 我决定尽量不使用正则表达式来捕捉数字。相反,我只是将整数转换为字符串,使用each_char循环获取每个字符,并在转换为整数时将其推送到新数组 然而,它似乎忽视了下划线(或许,这是正确的)。也许我想的不对,但我的理解是下划线不是整数 那么,在推/转换过程中,Ruby是否会在某个地方抛出一个无声错误,使其忽略下划线并继续不受阻碍?如果是,是否有方法捕获并查看此错误 这是我要说的代码Ruby 使用下划线转换整数是否会引发无声错误?,ruby,integer,Ruby,Integer,今天早些时候我在做一个练习,它涉及到对给定整数中的所有数字求和。其中一个数字有下划线 我决定尽量不使用正则表达式来捕捉数字。相反,我只是将整数转换为字符串,使用each_char循环获取每个字符,并在转换为整数时将其推送到新数组 然而,它似乎忽视了下划线(或许,这是正确的)。也许我想的不对,但我的理解是下划线不是整数 那么,在推/转换过程中,Ruby是否会在某个地方抛出一个无声错误,使其忽略下划线并继续不受阻碍?如果是,是否有方法捕获并查看此错误 这是我要说的代码 def summed_digi
def summed_digits2(int)
num_arr = []
int.to_s.each_char {|x| num_arr.push(x.to_i)}
num_arr.reduce(:+)
end
puts summed_digits2(123_456_789)
下划线只是开发人员的一种便利,基础数字没有下划线 一个简单的运动解决方案
def summed_digits2(int)
int.to_s.chars.map(&:to_i).inject(:+)
end
'123_456_789'
是一个包含数字和下划线的字符串。您可以使用regex
或字符串处理函数忽略下划线,只处理类似数字的字符
123_456_789
是一个数字。它与123456789
相同。它也与0x75bcd15
相同。它的值是相同的,即使它是用不同的方式写的。也可以使用编写,但其值仍然是123456789
(Ruby解析器不理解罗马数字。这里使用该语句只是为了强调这一点。) 数字中没有下划线,因为数字不是字符串。是的,不管它是写在纸上还是写在计算机程序上
回到您的问题,让我们注意到“数字之和”取决于数字的表示方式。大多数情况下,它是使用通常的10进制编写的,这就是我们在这里使用它的方式 有许多方法可以计算给定数字的位数之和。我最喜欢的:
123_456_789.to_s.chars.map(&:to_i).inject(:+)
工作原理:
123_456_789 # this is a number: 123456789
.to_s # convert to string: "123456789"
.chars # split to an array of chars: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
.map(&:to_i) # convert each array item to number: [1, 2, 3, 4, 5, 6, 7, 8, 9]
.inject(:+) # "inject" the addition operator ("+") between the items and compute: 45
其他答案也不错。我只想指出,ruby 2.4带来了
整数#数字
和可枚举#和
123_456_789.digits # => [9, 8, 7, 6, 5, 4, 3, 2, 1]
123_456_789.digits.sum # => 45
尽管Ruby的解析器将
123_456_789
和0x75bcd15
识别为123456789,但它无法解析罗马数字。说它可以这样写可能会让人困惑。@Stefan你的评论是正确的和有用的。我在回答中提到,Ruby解析器无法解析罗马数字。@axiac,但您也可以轻松地:)请参阅Ruby的文档:“下划线可用于增强人类的可读性”