gpt4 book ai didi

ruby - 未定义的方法 ... 对于类 (NoMethodError)

转载 作者:数据小太阳 更新时间:2023-10-29 08:18:58 27 4
gpt4 key购买 nike

我刚开始学习 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com