0

我正在学习红宝石,我试图弄清楚以下定义的含义:

class Rectangle::Square < Shape

所以我知道 Square 是 Shape 的子类,但为什么是范围解析运算符呢?这通常用于从 ruby​​ 的模块中访问类和常量,但是这里有类定义,那么它怎么可能已经位于模块中呢?谢谢你。

4

3 回答 3

0

此定义“打开”Rectangle类/模块并向其添加一个新类,Square. 这或多或少相当于

class Rectangle
  class Square < Shape
  end
end

我能想到的唯一区别是,如果Rectangle未定义,您的代码段将失败,而此代码段不会。

于 2012-07-18T19:02:26.860 回答
0

除了代码在Rectangle未定义时失败之外,还有另一个问题:

在该class Rectangle块中,您可以通过 引用其他类Square。在它之外,您必须将其称为Rectangle::Square. 但是,如果将其定义为class Rectangle::Square,则必须将类称为Rectangle::Square. 命名空间中的所有其他类(和其他常量)也是如此Rectangle。您经常看到这种模式的原因是代码编写者希望避免完全限定嵌套类。外部模块(在这种情况下)通常Rectangle包含一些需要相互交互的类。

这也是你经常可以看到这样定义的规范的原因:

class Rectangle
  describe Square
  end
end

这样你就可以通过做来构建一个正方形Square.new。如果是describe Rectangle::Square,那么您将需要完全限定它并执行Rectangle::Square.new

于 2012-07-18T22:34:02.140 回答
-1

这是同义词

module Rectangle
  class Square < Shape
  end
end
于 2012-07-18T19:03:25.377 回答