2012-05-02 72 views
2

我是一名剛開始學習Ruby的新手。我創建了這個代碼,但是它返回它不斷返回NoMethodError, undefined method new。我在這裏做錯了什麼?Ruby - 類方法

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的一個實例。因此,您正嘗試在Pessoa類的實例上調用new。 這是不可能的,因爲newClass類的實例方法:你正確地調用它在最後行Pessoa類,但你不能把它的一個實例(如pessoa1pessoa2,或Pessoa#initialize方法中的self),因爲它們中沒有一個是是類,因此沒有定義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

pessoa = self.new是你的問題。 initialize被稱爲一個已經被創建設立其初始狀態的對象,所以

  1. self沒有new方法有(因爲它不是一類)

  2. 有沒有在創建對象在那裏,它分配給局部變量pessoa,因爲它只會消失的方法完成後

我想你想要的一點是:

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