定义一个方法,如果接收对象大于参数对象ruby,则返回true

时间:2014-12-07 09:13:52

标签: ruby class methods

我是一个红宝石新手做了一个完整的堆栈网络开发课程@ Bloc.io,我遇到以下问题......

“我们应该能够在每个形状上调用一个greater_than?方法。这个方法应该评估两个形状并返回true或false,这取决于一个形状的区域大于另一个形状。换句话说,greater_than?方法应该返回如果接收对象大于参数对象,则返回true:

square.larger_than?(rectangle)

“如果方块大于矩形,则为true,否则为false”

这些是规格:

describe "Shape" do
  describe "larger_than?" do
    it "should tell if a shape is larger than 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
      expect( b.larger_than?(a) ).to eq(true)
      expect( a.larger_than?(b) ).to eq(false)
    end
  end

This is my code:

class Shape
  attr_accessor :color

  def initialize(color = nil)
    @color = color || 'Red'
  end

  def larger_than?
    if Shape.new.area > self.class.area
      true
    else
      false
    end
  end
end

class Rectangle < Shape
  attr_accessor :width, :height

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

  def area
    width * height
  end
end

class Square < Rectangle
  def initialize(side, color = nil)
    super(side, side, color)
  end
end

class Circle < Shape
  attr_accessor :radius

  def initialize(radius, color = nil)
    @radius = radius
    super(color) 
  end

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

错误:

ArgumentError
wrong number of arguments (1 for 0)
exercise.rb:8:in `larger_than?'

exercise_spec.rb:18:in `block (3 levels) in <top (required)>'

我真的很感激我对错过/做错的一些反馈。

1 个答案:

答案 0 :(得分:0)

免责声明:我试图不向您提供解决方案,而是提示自己获得解决方案。


larger_than?方法外,您的代码看起来不错。再想想如何调用该方法:

square.larger_than?(rectangle)

Shape对象上调用它,另一个Shape对象作为第一个参数。

因此,该方法需要一个参数(另一个形状)。 在该方法中,您可以使用self访问当前形状,使用其他形状(使用参数)来比较这两个区域。


还有一件小事:你这样做:

if Shape.new.area > self.class.area
  true
else
  false
end

if语句中的test-expression已经返回Boolean(第一种情况为true,第二种情况为false。因此,您可以直接返回test-expression的值,而不是编写if语句。


<强>更新

larger_than?方法应与此类似:

def larger_than?(otherShape)
  self.area > otherShape.area
end

self是调用larger_than?方法的Shape。要比较两种形状,您必须比较这些形状的区域。