2012-05-02 3 views
2

Я новичок, начинающий изучать Ruby. Я создал этот код, но он возвращает его обратно NoMethodError, undefined method new. Что я здесь делаю неправильно?Ruby - Class methods

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. Поэтому вы пытаетесь вызвать new на экземпляр класса Pessoa. Это невозможно, потому что new является метод экземпляра классаClass: вы правильно называть его на Pessoa класса в последних строках, но вы не можете назвать это на примере (например, pessoa1 или pessoa2, или self в методе 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 
3

Это ваша проблема. initialize вызывается на объект, который уже был создан, чтобы создать свое первоначальное состояние, так

  1. self не имеет new метод там (потому что это не класс)

  2. Там нет Дело в создании объекта там и присваиваем его локальной переменной pessoa, потому что она просто исчезнет после того, как метод закончил

Я думаю, что вы хотите:

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