0

私はルビーを学んでいて、次の定義が何を意味するのかを理解しようとしています。

class Rectangle::Square < Shape

だから私はSquareがShapeのサブクラスであることを知っていますが、なぜスコープ解決演算子なのですか?これは通常、rubyのモジュールからクラスと定数にアクセスするために使用されますが、ここにクラス定義があるので、モジュール内にすでに配置されているのはどうしてですか?ありがとうございました。

4

3 に答える 3

0

この定義はクラス/モジュールを「開き」Rectangle、それに新しいクラスを追加しますSquare。これは多かれ少なかれ同等です

class Rectangle
  class Square < Shape
  end
end

私が考えることができる唯一の違いは、Rectangle定義されていない場合、スニペットは失敗し、このスニペットは失敗しないということです。

于 2012-07-18T19:02:26.860 に答える
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

于 2012-07-18T22:34:02.140 に答える
-1

これはの同義語です

module Rectangle
  class Square < Shape
  end
end
于 2012-07-18T19:03:25.377 に答える