我刚刚开始学习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
Run Code Online (Sandbox Code Playgroud)
这是你的问题:
person_array = Array.new(number_of_people, Person)
Run Code Online (Sandbox Code Playgroud)
简而言之,不要像这样做数组.使用[]文字语法.这回归的是:
[Person, Person, Person]
Run Code Online (Sandbox Code Playgroud)
这是对Person类的3个引用,而不是实例.然后你会做:
person_array.push(Person.new(iq, speed, power, beauty))
Run Code Online (Sandbox Code Playgroud)
你最终得到:
[Person, Person, Person, person_instance]
Run Code Online (Sandbox Code Playgroud)
因此,当您遍历并调用send_for_beer第一个项目时,它确实具有该方法,因为send_for_beer您是在类对象上错误地调用的实例方法.
这里的解决方法是简单地分配person_array一个空数组文字,然后将其推送给它.
person_array = []
Run Code Online (Sandbox Code Playgroud)
一个小风格的笔记:<<通常是首选Array#push,使阵列的填充看起来更像这样.
person_array << Person.new(iq, speed, power, beauty)
Run Code Online (Sandbox Code Playgroud)
Ruby还支持隐式返回方法中的最后一个表达式.所以你不需要return result.相反,只需将返回值计算为方法中的唯一行.
def send_for_beer
@iq * 2 + @speed * 10 + @power * 5 + @beauty
end
Run Code Online (Sandbox Code Playgroud)
实例变量也不像那样工作.如果@name直接在类主体中,则不会为每个实例初始化实例变量.你实际上是在类对象上设置实例变量(这很奇怪,我知道).你真正需要做的是从任何实例方法设置它们,通常initialize是你在这里做的.因此,您可以在此处完全删除类级别的实例变量设置.
| 归档时间: |
|
| 查看次数: |
49864 次 |
| 最近记录: |