2012-05-02 2 views
2

Je suis un débutant commençant à apprendre Ruby. J'ai créé ce code, mais il le renvoie continue à renvoyer NoMethodError, undefined method new. Qu'est-ce que je fais mal ici?Ruby - Méthodes de classe

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 

Répondre

6

Au cours de l'exécution de Pessoa#initializeself détient une instance de la classe Pessoa. Par conséquent, vous essayez d'appeler new sur une instance de la classe Pessoa. Ceci est impossible, car new est une méthode d'instance de classe Class: vous correctement appeler la classe Pessoa dans les dernières lignes, mais vous ne pouvez pas l'appeler sur une instance (comme pessoa1 ou pessoa2, ou le self dans la méthode Pessoa#initialize), car aucun d'entre eux est une classe et ne définit donc pas la méthode new.

Le code correct serait:

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 est votre problème. initialize est appelée sur un objet qui a déjà été créé pour mettre en place son état initial, donc

  1. self n'a pas de là méthode new (car il est pas une classe)

  2. Il n'y a pas le point dans la création d'un objet là-bas et l'assigner à la variable locale pessoa, car il vient de disparaître après la méthode est terminée

Je pense que ce que vous voulez est:

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