先日、privateなクラスメソッドを定義しようとして、つまづきました。 なので、僕が実装に失敗したパターンと正しい実装方法を記載したいと思います。
失敗パターン
まず、僕が実装に失敗したパターンです。何事もなく呼び出せてしまっています。
class C private def self.def1 p 'def1' end end C.def1 # "def1"
正しい実装方法
Module#private_class_methodを使う場合
次に、正しく実装した場合です。想定通りdef1
がprivateメソッドになっているので、呼び出すことが出来ませんでした。
class C def self.def1 p 'def1' end private_class_method :def1 end C.def1 # a.rb:9:in `<main>': private method `def1' called for C:Class (NoMethodError)
class << selfの内部でprivateを指定する場合
また、class << selfの内部でprivateを指定しても、定義することが出来ました。
class C class << self private def def1 p 'def1' end end end C.def1 # a.rb:11:in `<main>': private method `def1' called for C:Class (NoMethodError)
結論
privateなクラスメソッドを定義するには、Module#private_class_method
を使用する、class << selfの内部でprivateを指定するの2パターンの方法があることが分かりました。