6

今天我在Rational类中遇到了奇怪的 ruby​​ 语法:

Rational(a,b)

.new()(请注意,与正常的 Ruby 语法相比,缺少该部分)。new与正常语法相比,这意味着什么?更重要的是,我如何在自己的代码中实现这样的东西,我为什么要实现这样的东西?专门针对Rational类,为什么使用这种语法而不是普通的实例化?为什么该new方法在理性类中是私有的?(以及我如何/为什么要在我自己的 ruby​​ 代码中执行此操作?)提前感谢您的回答,特别是因为我已经问了这么多问题。

4

2 回答 2

6

您所要做的就是声明一个与您的类同名的全局函数。这就是rational.rb 所做的:

def Rational(a, b = 1)
  if a.kind_of?(Rational) && b == 1
    a
  else
    Rational.reduce(a, b)
  end
end

使构造函数私有:

private :initialize

同样的new方法:

private_class_method :new

我想Rational.new可以保持公开并做些什么Rational(),但是拥有一个将其参数转换为实例的方法与Array(),String()等是一致的。这是一种易于实现和理解的熟悉模式。

于 2010-10-27T14:27:04.023 回答
3

Rational() 方法实际上是在 Rational 类之外定义的实例方法。因此,它成为加载库“理性”(通常是 main:Object)的任何对象的实例方法,就像“放置”一样,例如。

按照惯例,此方法通常是同名类的构造函数。

于 2010-10-27T14:37:22.160 回答