ESM アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

Rubyでprivateなクラスメソッドを定義するには

先日、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パターンの方法があることが分かりました。