ruby模块和类混淆

时间:2012-07-18 18:57:46

标签: ruby class module

我正在学习ruby,我正在试图找出以下定义的含义:

class Rectangle::Square < Shape

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

3 个答案:

答案 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