关于Rails框架的代码问题
问题描述:
我注意到,在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
选择
答
戴夫托马斯有一个不错的元编程屏幕视频系列,进入这些高级主题。我相信第二集讲述了自我类< <。 Screencasts可以在http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming
答
一个优点是,它可以让你轻松定义私有类方法:
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
答
它们实际上是不同的。第一个例子中的内部类声明实际上引用了SomeClass的特征类。本征类允许您为类定义特定于实例的行为。因此有些函数方法实际上并不属于类,而是属于类的实例。
至于为什么使用它,我可以看到它是有用的,如果你想扩展现有类的功能而不污染它的方法名称空间。
不能用其他形式创建类方法吗? – 2010-05-27 23:29:20
不使用Module#private,它只设置随后声明的实例方法的可见性。 – 2010-06-01 01:27:01