2012-02-28 105 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 
相关问题