如上所述,两种样式似乎是等效的,但是使用class << self
允许将类方法标记为private
或protected
。例如:
class UsingDefSelf
def self.a; 'public class method'; end
private
def self.b; 'public class method!'; end
end
class UsingSingletonClass
class << self
def a; 'public class method'; end
private
def b; 'private class method'; end
end
end
private
只影响实例方法。使用单例类,我们定义了该类的实例方法,这些实例方法变成了包含类的类方法!
我们还可以将类方法标记private
为def self
:
class UsingDefSelf
def self.a; 'private class method'; end
def self.b; 'private class method!'; end
private_class_method :a, :b
# In Ruby 2.1 there is an alternative syntax
private_class_method def self.c; 'private class method!'; end
end
但是我们不能将它们标记为protected
,没有protected_class_method
。(但是,由于类是其单例类的唯一实例,因此私有类方法和受保护类方法几乎相同,只是它们的调用语法不同。)
而且它比使用class << self
标记类方法更容易,因为您必须在每个私有类方法定义private
中列出所有方法名称private_class_method
或前缀。private_class_method