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

标签 ruby

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

相关文章:

ruby-on-rails - OAuth 提供者服务和 Rails 3

ruby-on-rails - 如何使用 Ruby Mongoid Moped 更新插入选项

ruby - 安装了哪个 ruby 版本?

ruby-on-rails - sidekiq 中的 perform_in 和 perform_async 有什么区别?

ruby-on-rails - Minitest 5 - 套件级设置

ruby - 在两个类之间共享一个类实例

ruby-on-rails - Ruby - 通过循环创建按位置分组的数组数组

ruby-on-rails - 带分页功能的 Google 自定义搜索 API

ruby - 如何获取类中的所有自定义方法?

ruby - 在不是今天的日期之前创建一个数组?