私はルビーを学んでいて、次の定義が何を意味するのかを理解しようとしています。
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