繁体   English   中英

红宝石模块和类混淆

[英]ruby module and class confusion

我正在学习红宝石,并试图找出以下定义的含义:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM