簡體   English   中英

未定義的方法...用於類(NoMethodError)

[英]undefined method … for class (NoMethodError)

我剛剛開始學習ruby並且我正在編寫一個簡單的程序,但是我有一個錯誤undefined method 'send_for_beer' for Person:Class (NoMethodError)這是一個代碼:

class Person
    @iq = 0
    @speed = 0
    @power = 0
    @beauty = 0
    def initialize (iq, speed, power, beauty)
        @iq = iq
        @speed = speed
        @power = power
    end

    def send_for_beer
        result @iq * 2 + @speed * 10 + @power * 5 + @beauty
        return result
    end
end

number_of_people = 3
person_array = Array.new(number_of_people, Person)
n = 0
beer_person = 0
beer_cof = 0
number_of_people.times do 

    ............
    person_array.push(Person.new(iq, speed, power, beauty))

    if person_array[n].send_for_beer > beer_cof     <-----here is an error
        beer_cof = person_array[n].send_for_beer
        beer_person = n
    end
    n = n+1
end

這是你的問題:

person_array = Array.new(number_of_people, Person)

簡而言之,不要像這樣做數組。 使用[]文字語法。 這返回的是:

[Person, Person, Person]

這是對Person類的3個引用,而不是實例。 然后你會做:

person_array.push(Person.new(iq, speed, power, beauty))

你最終得到:

[Person, Person, Person, person_instance]

因此,當您遍歷並在第一個項目上調用send_for_beer時,它確實具有該方法,因為send_for_beer是您在類對象上錯誤地調用的實例方法。

這里的修復是簡單地將person_array分配給空數組文字,然后將其推送給它。

person_array = []

還有一個小風格的注釋: <<通常比Array#push ,這使得數組的填充看起來更像這樣。

person_array << Person.new(iq, speed, power, beauty)

Ruby還支持隱式返回方法中的最后一個表達式。 所以你不需要return result 相反,只需將返回值計算為方法中的唯一行。

def send_for_beer
  @iq * 2 + @speed * 10 + @power * 5 + @beauty
end

實例變量也不像那樣工作。 如果直接在類主體中使用@name ,則不會為每個實例初始化實例變量。 你實際上是在類對象上設置實例變量(這很奇怪,我知道)。 你真正需要做的是從任何實例方法設置它們,通常是initialize ,你在這里做。 因此,您可以在此處完全刪除類級別的實例變量設置。

我認為你在方法send_for_beer存在語法錯誤,在變量result的影響中缺少=符號。

順便說一句,可以編寫該方法

def send_for_beer
    @iq * 2 + @speed * 10 + @power * 5 + @beauty
end

如果您有一個固定長度的數組,則可以提供一個塊來為每個元素創建一個新的Person對象。 您可以按如下方式重寫person_array行:

person_array = Array.new(number_of_people) { Person.new(0, 0, 0, 0) }

將以下行添加到您的類的頂部。

attr_writer(:iq, :speed, :power, :beauty)

然后,這段代碼可以修改數組中的對象。

person_array.each do |p|
    p.iq, p.speed, p.power, p.beauty = rand(20) + 1, rand(5) + 1, 1
    p.beauty = 10 if (rand(2) == 0)
end

暫無
暫無

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

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