2010-05-26 83 views
3

我注意到,在Rails框架的代碼使用以下約定所有的地方:關於Rails框架的代碼問題

class SomeClass 
    class << self 
    def some function 
    end 
    end 
end 

而不是

class SomeClass 
end 

def SomeClass.function 
end 

class SomeClass 
    def self.somefunction 
    end 
end 

這種設計選擇的原因是什麼?他們似乎都完成這些同樣的事情class << self選擇

回答

1

一個優點是,它可以讓你輕鬆定義私有類方法:

class SomeClass 
    class << self 
    def a_public_method 
     "This is a public class method" 
    end 

    private 
    def a_private_method 
     "This is a private class method" 
    end 
    end 
end 

否則,您必須使用private_class_method,即:

class SomeClass 
    def self.a_public_method 
    "This is a public class method" 
    end 

    def self.a_private_method 
    "This will be a private class method" 
    end 
    private_class_method :a_private_method 
end 
+0

不能用其他形式創建類方法嗎? – 2010-05-27 23:29:20

+0

不使用Module#private,它只設置隨後聲明的實例方法的可見性。 – 2010-06-01 01:27:01

1

它們實際上是不同的。第一個例子中的內部類聲明實際上引用了SomeClass的特徵類。本徵類允許您爲類定義特定於實例的行爲。因此有些函數方法實際上並不屬於類,而是屬於類的實例。

至於爲什麼使用它,我可以看到它是有用的,如果你想擴展現有類的功能而不污染它的方法名稱空間。