Ruby - Métodos de clase

Soy un novato que empieza a aprender Ruby. He creado este código, sin embargo, regresa, sigue regresando. NoMethodError, undefined method new. ¿Qué estoy haciendo mal aquí?

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

preguntado el 02 de mayo de 12 a las 19:05

2 Respuestas

Durante la ejecución de Pessoa#initialize self contiene una instancia de la clase Pessoa. Por lo tanto, está tratando de llamar new en una instancia de la clase Pessoa. Esto es imposible, porque new es un método de instancia de clase Class: lo estás llamando correctamente en el Pessoa clase en las últimas líneas, pero no puede llamarlo en una instancia (como pessoa1 or pessoa2, o el self en la Pessoa#initialize método), porque ninguno de ellos es una clase, y por lo tanto no definen el new método.

El código correcto sería:

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

contestado el 03 de mayo de 12 a las 00:05

Esa pessoa = self.new es tu problema. initialize se llama a un objeto que ya ha sido creado para configurar su estado inicial, por lo que

  1. self no tiene un new método allí (porque no es una clase)

  2. No tiene sentido crear un objeto allí y asignarlo a la variable local pessoa, porque simplemente desaparecerá una vez que finalice el método.

Creo que lo que quieres es:

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

contestado el 02 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.