我刚开始学习 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
,你在这里做的。因此,您可以在此处完全删除类级别的实例变量设置。
关于ruby - 未定义的方法 ... 对于类 (NoMethodError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9487568/