0

ルビーを学んでいます。このコードの課題が提示されます。

正方形、長方形、および円を表すクラスを作成します。各形状の面積を計算できるはずです。(デフォルトの色を継承するだけでなく、色を設定できるという部分もありますが、それは私が困惑している部分ではないので、ここでは仕様を含めません. )

can_fit?クラスは、 2 つの形状を評価し、一方の形状が他方の形状に適合することに基づいて true または false を返すメソッドを呼び出すこともできる必要があります。

だから私はシェイプクラスをうまく作成し、正方形、長方形、円の面積をうまく計算しています。

しかし、私はそのcan_fit?方法に完全に困惑しています。クラスに含めることになっていますが、面積を使用して比較していて、面積にアクセスできない場合、ある形状がクラスShape内の別の形状に収まるかどうかを比較するにはどうすればよいですか??ShapeShape

class Shape
  attr_accessor :color
  def initialize(color="Red")
    @color = color
  end

  def can_fit?(shape)
    DEFINE METHOD
  end

end

class Rectangle < Shape

attr_accessor :color, :shape, :width, :height

def initialize(width, height, color="Red")
  super(color)
  @width = width
  @height = height
end

def area
  @width * @height
end

end

class Square < Rectangle

  def initialize(width, color= "Red")
    super(width, width, color)
  end

end

class Circle < Shape
attr_accessor :color, :shape, :radius

def initialize(radius, color= "Red")
  super(color)
  @radius = radius
end

def area
  Math::PI * (radius ** 2)
end

end

RSpec テスト:

describe "Shape" do
   describe "can_fit?" do
     it "should tell if a shape can fit inside another shape" do

     class A < Shape
       def area
         5
       end
     end
     class B < Shape
       def area
        10
       end
     end
     a = A.new
     b = B.new
     b.can_fit?(a).should eq(true)
     a.can_fit?(b).should eq(false)
  end
end
4

5 に答える 5

1

RubyはShapeareaメソッドがなくても構いません。評価の瞬間にオブジェクトがどのように振る舞うかだけを気にします。can_fit?以下のメソッドの場合、selfは Square のインスタンスであり、other_shapeは circle のインスタンスです。どちらも面積方式です。とても素晴らしい!other_shape完全に別のオブジェクトであったとしても、areaメソッドがあれば機能します。

例 (ここでは「計算」は無視してください!)

2.0.0-p195 :001 > class Shape
2.0.0-p195 :002?>   def can_fit? other_shape
2.0.0-p195 :003?>     area > other_shape.area
2.0.0-p195 :004?>   end
2.0.0-p195 :005?> end
 => nil 
2.0.0-p195 :006 > class Square < Shape
2.0.0-p195 :007?>   def area
2.0.0-p195 :008?>     2
2.0.0-p195 :009?>   end
2.0.0-p195 :010?> end
 => nil 
2.0.0-p195 :011 > class Circle < Shape
2.0.0-p195 :012?>   def area
2.0.0-p195 :013?>     1
2.0.0-p195 :014?>   end
2.0.0-p195 :015?> end
 => nil 
2.0.0-p195 :016 > Square.new.can_fit? Circle.new
 => true 

その後...

2.0.0-p195 :017 > class Cat # doesn't inherit from anything
2.0.0-p195 :018?>   def area
2.0.0-p195 :019?>     1.5
2.0.0-p195 :020?>   end
2.0.0-p195 :021?> end
 => nil 
2.0.0-p195 :022 > Square.new.can_fit? Cat.new
 => true 
于 2013-10-31T21:03:25.680 に答える
0

定義されたメソッドで新しいクラス Area を作成し、それに Shape を呼び出すことは可能でしょうか? ちょっとした考え

于 2013-10-31T20:37:13.703 に答える
0

私たちが持っているとしましょう

c = Circle.new(2)
r = Rectangle.new(2,3)

次に、次のメソッドを に追加しましょうclass Shape

def self_check
  puts self
end

cこのメソッドをとに送信するとr、次の結果が得られます。

c.self_check # => #<Circle:0x007fd71927fc98 @color="Red", @radius=1> 
r.self_check # => #<Rectangle:0x007fd71925e368 @color="Red", @width=2, @height=3>

したがってself_check、親クラスにあるにもかかわらずself、それを呼び出すサブクラスのインスタンスです。これはcan_fit?(other_shape)、シェイプ インスタンスselfと引数の両方にアクセスできることを意味しますother_shape。したがって、次の 1 を実行できます。

def can_fit?(other_shape)
  case self
  when Circle
    case other_shape
    when Circle
      self.radius <= other_shape.radius
    when Rectancle, Square
      self.radius <= [other_shape.width, other_shape.height].min
    end
  when Rectangle
    case other_shape
    when Circle
    ...
    ...

特定のインスタンス インスタンスcが特定の長方形のインスタンスに収まるかどうかを確認するrには、次を実行します。

c.can_fit?(r)

1 構文で使用される とは対照的に、case ステートメントは===演算子を使用することに注意してください。そのため、真かどうかを評価できます。==if/thencaseself === Circle

于 2013-10-31T21:45:26.673 に答える
0

can_fit を定義する必要がありますか? other_shape.area と比較して self.area を使用する Class Shape のメソッド

すでに各クラスのエリアがあるため:

def can_fit?(other_shape)
  self.area > other_shape.area
end
于 2013-11-01T01:39:07.123 に答える
0

単純な解決策は、1 つの形状の高さと幅の両方が、最初の形状を入れようとしている形状の高さと幅よりも小さいか、等しいかどうかを確認することです。

円の場合、幅と高さの両方が円の直径になります。

これらの形状を回転できるかどうかわからないので、「ナイーブ」と言いまし。の場合、おそらく長方形の対角線など、他の寸法を計算する必要がある場合があります。

あなたが Ruby を使っていることは知っていますが、Ruby での継承の意味を正確に理解するには注意が必要かもしれません。Scott Meyers の C++ に関する書籍の 1 つで、この正確な例を使用して、数学モデル (「正方形は長方形でもある」) が C++ の継承に直面してどのように崩壊するかを示しています。クラス Rectangle から派生したクラス Square は、数学的な定義と同じ優雅さで表現することはできません。Ruby についての答えはわかりませんが、(学んでいる限り) 見たいと思うでしょう。

于 2013-10-31T20:18:16.437 に答える