3

我是刚开始学习 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
4

2 回答 2

7

在执行期间Pessoa#initialize self持有一个类的实例Pessoa。因此,您正在尝试调用newclass 的实例Pessoa。这是不可能的,因为new是class的实例方法Class:您在Pessoa最后几行的类上正确调用它,但不能在实例上调用它(例如pessoa1or pessoa2,或方法self中的 the Pessoa#initialize),因为没有其中一个是 Class,因此不要定义该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
于 2012-05-02T18:20:05.717 回答
3

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

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

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

我想你想要的是:

def initialize(nome, idade, altura)
  @nome = nome
  @idade = idade
  @altura = altura
  @@lista << self
end
于 2012-05-02T18:18:28.857 回答