转换带下划线的整数会产生无声错误吗?

时间:2017-09-06 09:53:49

标签: ruby integer

我今天早些时候正在进行一项练习,它涉及将给定整数中的所有数字相加。其中一个数字有下划线。

我决定尝试使用正则表达式来捕获数字。相反,我只是将整数转换为字符串,使用each_char循环来获取每个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)

3 个答案:

答案 0 :(得分:3)

'123_456_789'是一个包含数字和下划线的字符串。您可以使用regex或字符串处理函数忽略下划线并仅处理数字相似的字符。

123_456_789是一个数字。它与123456789相同。它也与0x75bcd15相同。它的价值是相同的,即使它是以不同的方式写的。它也可以使用Roman numerals编写,但其值仍为123456789 (Ruby解析器了解罗马数字。这里使用的语句只是为了强调这个想法。)

数字中没有下划线,因为数字不是字符串。它是an amount, a quantity, a concept,无论它是如何写在纸上或计算机程序中的。

回到你的问题,让我们注意"数字的总和"取决于数字的表示方式。大多数时候它是使用通常的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

答案 1 :(得分:2)

下划线只是开发人员的一个便利,基础数字没有下划线。

锻炼的简单解决方案

def summed_digits2(int)
  int.to_s.chars.map(&:to_i).inject(:+)
end

答案 2 :(得分:2)

其他答案都很好。我只是指出ruby 2.4带来了Integer#digitsEnumerable#sum

123_456_789.digits # => [9, 8, 7, 6, 5, 4, 3, 2, 1]
123_456_789.digits.sum # => 45