2012-05-02 63 views
2

我是一名刚开始学习Ruby的新手。我创建了这个代码,但是它返回它不断返回NoMethodError, undefined method new。我在这里做错了什么?Ruby - 类方法

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 

回答

6

Pessoa#initializeself执行期间保持类Pessoa的一个实例。因此,您正尝试在Pessoa类的实例上调用new。 这是不可能的,因为newClass类的实例方法:你正确地调用它在最后行Pessoa类,但你不能把它的一个实例(如pessoa1pessoa2,或Pessoa#initialize方法中的self),因为它们中没有一个是是类,因此没有定义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 
3

pessoa = self.new是你的问题。 initialize被称为一个已经被创建设立其初始状态的对象,所以

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

  2. 有没有在创建对象在那里,它分配给局部变量pessoa,因为它只会消失的方法完成后

我想你想要的一点是:

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