我注意到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
这种设计选择的原因是什么?他们似乎都完成了同样的事情
答案 0 :(得分:1)
class << self
选择的一个优点是它允许您轻松定义私有类方法:
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
答案 1 :(得分:1)
它们实际上是不同的。第一个示例中的内部类声明实际上引用了SomeClass的本征类。特征类允许您为类定义特定于实例的行为。因此,某些函数方法实际上并不属于该类,而是属于该类的实例。
至于为什么使用它,如果你想扩展现有类的功能而不污染它的方法命名空间,我会发现它很有用。
答案 2 :(得分:1)
戴夫·托马斯有一个很好的元编程截屏系列,它涉及这些高级主题。我相信第二集讲的是关于课程&lt;&lt;自。可以在http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming
找到截屏视频