我正在学习红宝石,我试图弄清楚以下定义的含义:
class Rectangle::Square < Shape
所以我知道 Square 是 Shape 的子类,但为什么是范围解析运算符呢?这通常用于从 ruby 的模块中访问类和常量,但是这里有类定义,那么它怎么可能已经位于模块中呢?谢谢你。
此定义“打开”Rectangle
类/模块并向其添加一个新类,Square
. 这或多或少相当于
class Rectangle
class Square < Shape
end
end
我能想到的唯一区别是,如果Rectangle
未定义,您的代码段将失败,而此代码段不会。
除了代码在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
这是同义词
module Rectangle
class Square < Shape
end
end