Ruby - 类方法

时间:2012-05-02 18:12:47

标签: ruby methods

我是一个开始学习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

2 个答案:

答案 0 :(得分:6)

在执行Pessoa#initialize期间self拥有类Pessoa的实例。因此,您尝试在类new的实例上调用Pessoa。 这是不可能的,因为new是类Class实例方法:您在最后一行的Pessoa类中正确调用它,但是您无法在实例(例如pessoa1pessoa2self方法中的Pessoa#initialize)上调用它,因为它们都不是类,因此不要定义new方法。

正确的代码是:

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

答案 1 :(得分:3)

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

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

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

  3. 我认为你想要的是:

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