我很难理解一些Ruby代码

时间:2016-02-19 08:15:20

标签: ruby

我很难理解codecademy中的两行代码。

require 'prime'

def first_n_primes(n)
  "n must be an integer" unless n.is_a? Integer
  "n must be greater than 0" if n <= 0
  prime = Prime.instance
  prime.first n
end

first_n_primes(10)

您能否解释一下Prime.instance的含义以及prime.first n是什么?

2 个答案:

答案 0 :(得分:7)

素数是一个普遍的概念,每次使用代码时,您都不需要考虑创建枚举器/素数集的不同实例。 (理想情况下)它应该与您调用单例方法的模块/方法相当:

Math.sin(0)

而不是错误的形式:

Math.new.sin(0)

然而,Prime类被(错误地)设计为像上面的后一种形式一样被使用:

Prime.new.each(30)

只有一个主要枚举器实例(即Prime是一个单例类)。因此,出于历史原因,保留了这种用法(直到Ruby 2.2),但后来注意到,由于它是单例,因此应鼓励将new替换为instance

Prime.instance.each(30)

与包含Singleton模块的类一样。

关于first n,它需要枚举器中的第一个n元素。

答案 1 :(得分:3)

Prime是一个Ruby类。通过调用prime = Prime.instance,您将实例化prime类的Prime对象,该对象基本上是所有素数的集合。该对象具有类Prime的公共方法,包括#first,当呈现参数(n)时,将返回前n个素数的数组。