2014-11-23 52 views
0

有人能解釋一下Ruby中這3個(顯然)相同的例子嗎?Ruby:在類中聲明方法的不同方法

代碼#1

class User < ActiveRecord::Base 
    def something 
     .... 
    end 
end 

代碼#2

class User < ActiveRecord::Base 
    def User.something 
     .... 
    end 
end 

代碼#3

class User < ActiveRecord::Base 
    def self.something 
     .... 
    end 
end 
+0

請參閱關於'class methods'的[this](http://www.railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/) '實例方法' – Anthony 2014-11-23 17:21:36

回答

0
class User < ActiveRecord::Base 
    def something 
     # .... 
    end 

    def User.something 

    end 

    def self.something 

    end 
end 

這裏,第一個是一個實例方法,其只能與用戶

ex: User.new.something 

其它兩種方法是類方法(也稱爲singleton方法)的實例被調用。哪些只能在用戶類上調用。

ex: User.something 

還有調用類的方法

class User < ActiveRecord::Base 
    class << self 
    def something 
     "wolf" 
    end 
    end 
end 
+1

所以可以肯定的說例#2和#3是**完全相同的嗎? – 2014-11-23 17:22:07

+0

對呀!他們是同一個單身人士或幽靈班的成員。這裏singleton是User對象的類。 – Rubyrider 2014-11-23 17:28:05

+0

實際上所有的類方法和對象的單重方法都存儲在一個單獨的類中,這個類也被稱爲特徵類或未知類。當您調用方法時,方法查找從那裏開始 – 2014-11-23 17:31:24

0
class User < ActiveRecord::Base 
    def something 
    .... 
    end 
end 

回答另一種方式:這種方法將可爲該類的實例/對象的單例類。

class User < ActiveRecord::Base 
    def User.something 
     .... 
    end 
end 

class User < ActiveRecord::Base 
    def self.something 
     .... 
    end 
end 

class User < ActiveRecord::Base 
    class << self 
     def something 
      ....... 
     end 
    end 
end 

這些最後3種方法被定義爲類級別。基本上,類是以編程方式對象的,它們只能用於這些類。如果您不介意我想建議您觀看以下視頻。 The Ruby Object Model and Metaprogramming

+0

您在回答結束時丟失了我 – 2014-11-23 17:33:00

+0

okey讓我刪除它。但請觀看我提供的視頻鏈接。你會喜歡這一點,並獲得更多有關首先理解更重要的ruby對象的建設性想法。所以這些問題將會很清楚。 https://www.youtube.com/watch?v=io34q2G4eOU&list=PLDOo4JBO2P5_Tjug8Yl7PANb0sZtO7R_D – Rubyrider 2014-11-23 17:35:09