上で述べたように、どちらのスタイルも同じように見えますが、 を使用すると、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 はその singletonclass の唯一のインスタンスであるため、private クラスのメソッドと保護されたクラスのメソッドは、呼び出し構文が異なることを除いてほとんど同じです。)
また、すべてのプライベート クラス メソッド定義にすべてのメソッド名またはプレフィックスをリストする必要があるため、クラス メソッドclass << selfをマークするために使用するよりも簡単ではありません。privateprivate_class_methodprivate_class_method