上で述べたように、どちらのスタイルも同じように見えますが、 を使用すると、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
をマークするために使用するよりも簡単ではありません。private
private_class_method
private_class_method