NoMethodError,Ruby中未定义的方法

时间:2014-10-16 03:46:52

标签: ruby class inheritance module nomethoderror

我是Ruby新手,我正在进行关于 Classes 继承的练习。

说明如下:

我们应该可以调用更大的_than?每种形状的方法。此方法应评估两个形状并返回true或false,具体取决于一个形状的区域比另一个大。换句话说,large_than?如果接收对象大于参数对象,则该方法应返回true:

我在创建large_than时遇到问题?方法。我不知道如何从其他形状中获取该区域并将其与接收对象的区域进行比较。

这是我的代码:

class Shape
  attr_accessor :color, :area

  def initialize(color = nil)
    @color = color || 'Red'
  end  
  def larger_than?(object_area)
   if self.class.area > object_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) # this calls Shape#initialize
  end
  def area
    width * height
  end
end

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

class Circle < Shape
  attr_accessor :radius

  def initialize(radius, color = nil)
    @radius = radius
    super(color) # this calls Shape#initialize
  end
  def area
    Math::PI * (radius*radius)
 end
end

我不明白为什么我会遇到这个错误:

NoMethodError
undefined method `larger_than?' for #<B:0x007fdf3047d5a8 @color="Red">

1 个答案:

答案 0 :(得分:0)

如果您提供了调用此比较的实际代码,将会有所帮助,但基于此代码,您尝试将Fixnum类(基本上是整数)的值与NilClass(基本上没有)进行比较。

我假设第4行是这个

if shape.area > self.class.area

我假设当你调用这个行shape.area包含某种类的Fixnum,它可以作为Instance方法计算,而你将它与Class方法进行比较

所以有两个问题

  1. 为什么Shape类中的区域是Class方法? self.area - 意味着它被执行为Shape.area而不是Shape.new.area - 我认为这就是你想要的。
  2. 你不能比较nil(这是Shape.area -returns。空方法返回nil,因为没有别的东西可以做)和一个数字。你可以将nil强制成一个整数,如nil.to_i =&gt; 0,然后进行比较,但我不认为这是你的意图。
  3. 如果您可以提供实际调用这些类的代码或解释您要执行的操作,我将能够为您提供进一步的帮助。