2013-04-28 97 views
0

下面的代碼返回一個錯誤:問題與Ruby類方法的定義

class ABC 
    def self.method1() 
    method2 
    end 

    def method2 
    end 
end 

ABC.method1

NameError: undefined local variable or method `method2' for ABC:Class

但是,下面的代碼工作正常:

class ABC 
    def initialize 
    method2 
    end 

    def method2 
    end 
end 

ABC.new

是否初始化需要使用爲了正確定義班級內的所有方法?第一個代碼塊有什麼問題?

回答

3

不具有類的對象不能調用實例方法。

method1是類ABC的類方法,因此您可以在類本身上調用它。但是如果你想調用你的實例方法method2,你需要一個類ABC的對象,而不是在類本身上調用它,即。

o = ABC.new 
o.method2 

的其他代碼的作品,因爲在initialize,你已經擁有你的ABC例如,你的方法調用可以理解爲self.method2

2

method1是靜態的,不是method2

ABC.method2是不確定的,ABC.new.method2是確定

class ABC 

    def self.method1() 
    method2 # ABC.method2 
    end 

    def initialize 
    method2 # self.method2, self is instance of ABC 
    end 

    def method2 
    end 
end 
+0

語言評論:'靜態'是一個技術術語,它值得了解,但在Ruby本身中很少使用。在Ruby中,調用這種方法最明確的方法是'單例方法',或'對象的單例類的實例方法'。類的Singleton方法(它們本身就像任何其他對象一樣)常常被暱稱爲「類方法」,以便將它們與類的實例方法區分開來。出於類似的原因,模塊的單例方法被暱稱爲「模塊方法」。 – 2013-04-28 13:46:54

0

在第一個代碼塊中,您嘗試在類方法中調用實例方法,它就像調用ABC.method2一樣,但ABC沒有這種方法。