クラスメソッドをprivateメソッドにする方法

単純にprivateにするだけはダメです。

class Foo
  def self.bar
    puts 'bar'
  end

  private

  def self.baz
    puts 'baz'
  end
end

Foo.baz
=>baz

という風に実は普通に呼べています。

方法は二種類あります。

  • self内でprivateを呼ぶ
  • private_class_methodを定義する

self内privateを呼ぶ

class Foo
  def self.bar
    puts 'bar'
  end

  class << self
    private

    def baz
      puts 'baz'
    end
  end
end

Foo.baz
NoMethodError: private method `baz' called for Foo:Class
Did you mean?  bar

きちんとprivate化されていますね。

private_class_methodを定義する

class Foo
  def self.bar
    puts 'bar'
  end

  def self.baz
    puts 'baz'
  end

  private_class_method :baz
end

Foo.baz
NoMethodError: private method `baz' called for Foo:Class
Did you mean?  bar

同じ結果になっています。 ただし、後者はメソッドが定義された後に書かないといけなません。

そこは注意が必要ですね。

以上です。