我是一个红宝石新手做了一个完整的堆栈网络开发课程@ 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)>'
我真的很感激我对错过/做错的一些反馈。
答案 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。要比较两种形状,您必须比较这些形状的区域。