[英]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.