一种创建巨数的方法

A method for creating a huge number

RubyMonk 指出了如何使用下划线来方便地编写大量数字,如果不进行分界,这些数字将变得难以阅读。

他们的任务是:尝试使用下划线来制作一个巨大的、可读的数字。他们提供此代码:

def describe(something)
  puts "I am a: #{something.class} and I look like: #{something}"
end

def big_num
  # create a huge number
end

describe(big_num)

谁能解释一下我将如何创造一个巨大的数字?根据下面的错误信息,我必须在代码中使用下划线才能通过。

Ruby 允许您在书写文字数字时加上下划线,以便大数字更易于阅读。

惯例是,如果数字的长度为 4 位或更少,则不应在每三个数字上加上下划线,如果它更长,则从右开始:

10_000_000 # => 10000000

也适用于浮点数:

10_000.0 # => 10000.0

如果将下划线放在两个数字之间,解释器将忽略它们:

1_2_3_4_5 # => 12345

查看错误信息后,很明显RubyMonk 期望Bignum。这是另一个魔术,解释器透明地执行 - 如果数字小到可以映射到体系结构的 int,则该数字是 Fixnum:

的实例
100.class # => Fixnum

如果不是这种情况,Ruby 会自动使用专用的 class (Bignum):

(10_000_000**100).class # => Bignum
  # 10_000_000 to the power of 100, 
  # which is a very big number and
  # thus stored in Bignum

RubyMonk 需要 class Bignum 的对象,它是标准 Ruby 库的一部分。来自文档:

Bignum objects hold integers outside the range of Fixnum. Bignum objects are created automatically when integer calculations would otherwise overflow a Fixnum.

所以你只需要创建一个大于 Fixnum 可以处理的数字。例如,这将通过 RubyMonk 的规范:

def big_num
  5_000_000_000_000_000_000_000
end

因为数字大于 Fixnum 的处理能力,Ruby 自动 returns 一个 Bignum。例如,尝试 运行 这个:

5_000_000_000.class
# => Fixnum
5_000_000_000_000_000_000_000.class
# => Bignum 

Ruby 允许使用下划线作为占位符(即它们只是为了增加人类的可读性,否则将被忽略)。所以你的 big_num 方法可以只有一行:

return 1_000_000_000_000_000_000_000_000_000_000_000

调用它会 return 1000000000000000000000000000000000

return 关键字是可选的)