2011-01-10 62 views
12

可能重複:
class << self idiom in Ruby
Can someone please explain class << self to me?Rails中的「class << self」是什麼意思?

我想知道是什麼class << self聲明,模型類是什麼意思?那裏面的陳述與它之外的陳述有什麼不同呢?例如:

class Post < ActiveRecord::Base 

    class << self 
    def search(q) 
      # search from DB 
    end 
    end 
    def search2(qq) 
     # search from DB 
    end 
end 

class << self是什麼意思?

有什麼方法search(q)search2(qq)之間的區別是什麼?

+0

search2是一個非常差的方法名稱。 – 2011-01-10 12:36:13

回答

22

這是一樣的

class Post < ActiveRecord::Base 

    def self.search(q) 
    # Class Level Method 
    # search from DB 
    end 

    def search2(qq) 
    # Instance Level Method 
    # search from DB 
    end 
end 

類方法的類(如郵政)合作,實例方法適用於(如郵政該類的實例。新)

有人喜歡class << self; code; end;方式,因爲它保持在一個不錯的塊和一個地方的所有一流水平的方法。

有些人則喜歡前綴的每一個法self.明確地知道這是一個類的方法不是一個實例方法。這是一個風格問題和你如何編碼。如果將所有類的方法放在class << self這樣的塊中,並且該塊足夠長,那麼class << self行可能不在編輯器視圖中,這使得難以知道您處於類實例塊中。另一方面,將每個方法前綴爲self.並將它們與實例方法混合在一起也是一個壞主意,在閱讀代碼時如何知道所有類方法。

選擇您希望爲自己的代碼庫,但如果你在一個開源項目工作,或者你在別人的代碼進行合作,利用他們的代碼格式規則的成語。

1

它創建類方法而不是實例方法。這和def self.search(q)一樣。這兩種方法將被稱爲像:

Post.search(q) 
Post.new.search(qq) 
0

search2是一個實例,方法而search是一個類方法。 class << self語法使您可以將以下類方法分組。在Ruby中定義類方法有三種方法:

class MyClass 
    def self.method 
     # do sth. 
    end 

    def MyClass.method2 
     # do sth. 
    end 

    class << self 
     def method3 
      # do sth. 
     end 

     def another_class_method 
      # do sth. 
     end 
    end 
end 

在類上調用類方法,而不是在實例上調用類方法。個人喜好你想使用三種成語中的哪一種。沒有特別原因,我更喜歡def self.method