【问题标题】:Ruby - Class methodsRuby - 类方法
【发布时间】:2012-05-02 18:12:46
【问题描述】:

我是刚开始学习 Ruby 的新手。我已经创建了这段代码,但是它返回它一直返回NoMethodError, undefined method new。我在这里做错了什么?

class Pessoa
  attr_accessor :nome, :idade, :altura

  @@lista = []

  def self.lista
    @@lista
  end

  def initialize(nome, idade, altura)
    pessoa = self.new
    pessoa.nome = nome
    pessoa.idade = idade
    pessoa.altura = altura
    @@lista << self
  end
end

pessoa1 = Pessoa.new("Joao",13,2)
pessoa2 = Pessoa.new("Alfredo",15,1)
puts Pessoa.lista.inspect

【问题讨论】:

    标签: ruby methods


    【解决方案1】:

    Pessoa#initialize 的执行过程中,self 持有Pessoa 类的一个实例。因此,您尝试在类Pessoa 的实例上调用new。 这是不可能的,因为newClass 类的实例方法:你在最后几行的Pessoa 类上正确调用它,但你不能调用它一个实例(例如pessoa1pessoa2,或Pessoa#initialize 方法中的self),因为它们都不是,因此不要定义@987654333 @方法。

    正确的代码是:

    class Pessoa
      attr_accessor :nome, :idade, :altura
    
      @@lista = []
    
      def self.lista
        @@lista
      end
    
      def initialize(nome, idade, altura)
        @nome = nome
        @idade = idade
        @altura = altura
        @@lista << self
      end
    end
    
    pessoa1 = Pessoa.new("Joao",13,2)
    pessoa2 = Pessoa.new("Alfredo",15,1)
    puts Pessoa.lista.inspect
    

    【讨论】:

      【解决方案2】:

      pessoa = self.new 是你的问题。 initialize 在已经创建的对象上调用以设置其初始状态,所以

      1. self 没有 new 方法(因为它不是一个类)

      2. 在那里创建一个对象并将其分配给局部变量pessoa是没有意义的,因为它会在方法完成后消失

      我想你想要的是:

      def initialize(nome, idade, altura)
        @nome = nome
        @idade = idade
        @altura = altura
        @@lista << self
      end
      

      【讨论】:

        猜你喜欢
        • 2021-09-05
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        • 2015-04-04
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多