Ruby 使用下划线转换整数是否会引发无声错误?

Ruby 使用下划线转换整数是否会引发无声错误?,ruby,integer,Ruby,Integer,今天早些时候我在做一个练习,它涉及到对给定整数中的所有数字求和。其中一个数字有下划线 我决定尽量不使用正则表达式来捕捉数字。相反,我只是将整数转换为字符串,使用each_char循环获取每个字符,并在转换为整数时将其推送到新数组 然而,它似乎忽视了下划线(或许,这是正确的)。也许我想的不对,但我的理解是下划线不是整数 那么,在推/转换过程中,Ruby是否会在某个地方抛出一个无声错误,使其忽略下划线并继续不受阻碍?如果是,是否有方法捕获并查看此错误 这是我要说的代码 def summed_digi

今天早些时候我在做一个练习,它涉及到对给定整数中的所有数字求和。其中一个数字有下划线

我决定尽量不使用正则表达式来捕捉数字。相反,我只是将整数转换为字符串,使用each_char循环获取每个字符,并在转换为整数时将其推送到新数组

然而,它似乎忽视了下划线(或许,这是正确的)。也许我想的不对,但我的理解是下划线不是整数

那么,在推/转换过程中,Ruby是否会在某个地方抛出一个无声错误,使其忽略下划线并继续不受阻碍?如果是,是否有方法捕获并查看此错误

这是我要说的代码

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的文档:“下划线可用于增强人类的可读性”