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