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に、クラスのインスタンスを保持しますPessoanewしたがって、クラスのインスタンスを呼び出そうとしていますPessoa。クラスnewインスタンスメソッドであるため、これは不可能です。最後の行Classのクラスで正しく呼び出していますが、インスタンス(または、またはメソッド内)で呼び出すことはできません。それらのうちのクラスはクラスであるため、メソッドを定義しないでください。Pessoapessoa1pessoa2selfPessoa#initializenew

正しいコードは次のとおりです。

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 に答える