我正在学习ruby,我正在试图找出以下定义的含义:
class Rectangle::Square < Shape
所以我知道Square是Shape的子类,但为什么是范围解析运算符? 这通常用于从ruby中的模块访问类和常量,但这里有类定义,那么它怎么可能已经位于模块内?谢谢。
答案 0 :(得分:0)
此定义“打开”Rectangle
类/模块,并为其添加新类Square
。这或多或少等同于
class Rectangle
class Square < Shape
end
end
我能想到的唯一区别是,如果未定义Rectangle
,则您的代码段会失败,而且此代码段不会。
答案 1 :(得分: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
答案 2 :(得分:-1)
这是
的同义词module Rectangle
class Square < Shape
end
end