2012-02-28 118 views
2

我只是要重新開始學習Ruby和我正在寫一個簡單的程序,但我有一個錯誤undefined method 'send_for_beer' for Person:Class (NoMethodError) 下面是一個代碼:未定義的方法...類(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 

回答

8

這是你的問題:

person_array = Array.new(number_of_people, Person) 

總之,不要讓陣列這樣。使用[]文字語法。這是什麼返回是:

[Person, Person, Person] 

也就是說3個引用到Person類,而不是實例。再後來你做:

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

而且你結束了:

[Person, Person, Person, person_instance] 

所以,當你遍歷並就第一個項目叫send_for_beer,它確實有一個方法,因爲send_for_beer是一個實例方法您在類對象上錯誤地調用。

此處的修復方法是將簡單地分配給一個空的數組文字,然後將其推送到它。

person_array = [] 

和次要樣式注意:<<通常優選Array#push,使陣列的填充看上去就像這樣。

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

紅寶石還支持的方法中的最後一個表達式的隱式返回。所以你不需要return result。相反,只需將返回值作爲方法中的唯一行來計算即可。

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

實例變量做這樣的不完全奏效。如果直接在類體中有@name,則不會爲每個實例初始化實例變量。你實際上是在類對象上設置實例變量(這很奇怪,我知道)。你實際需要做的是從任何實例方法中設置它們,通常是initialize,你在這裏做的。所以你可以在這裏完全刪除類級別的實例變量設置。

1

我認爲在方法send_for_beer中有一個語法錯誤,在變量result的作用中缺少=符號。

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

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

如果您有一個固定長度的數組,您可以提供一個塊爲每個元素創建一個新的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 
相關問題