簡體   English   中英

NoMethodError,Ruby中未定義的方法

[英]NoMethodError, undefined method in Ruby

我是Ruby的新手,正在從事有關繼承的練習。

說明如下:

我們應該能夠調用一個更大的比? 每個形狀的方法。 此方法應評估兩個形狀,並根據一個形狀的面積大於另一個形狀的面積返回真或假。 換句話說,“大於”? 如果接收對象大於參數對象,則方法應返回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">

如果您提供了調用此比較的實際代碼,這將很有幫助,但是基於此代碼,您試圖將Fixnum類的值(本質上是一個整數)與NilClass(基本上什么都沒有)進行比較。

我假設第4行是這個

if shape.area > self.class.area

我假設當您調用此線形時.area包含某種數量的Fixnum類,在將其與Class方法進行比較時會以Instance方法的形式進行計算

所以兩個問題

  1. 為什么Shape類中的area是Class方法? self.area-表示將其作為Shape.area執行,而不是Shape.new.area-我認為這是您想要的。
  2. 您無法比較nil(這是Shape.area -returns的結果。空方法將返回nil,因為它們沒有其他操作可做)和一個數字。 您可以將nil強制為一個整數,例如nil.to_i => 0,然后進行比較,但是我認為這不是您想要的。

如果您可以提供一段實際調用這些類的代碼或解釋您要執行的操作-我將能夠為您提供進一步的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM