Rubyのクラスメソッドをprivate化する

意外と知らない小ネタ

Rubyのクラスメソッドをprivate化する際に以下のような宣言の仕方だとうまくprivate化されず、

class Hoge
  private

  def self.hoge
    puts 'hoge'
  end
end

Hoge.hoge

実行結果は

hoge

となってしまいます。

原理は詳しくはソースを読んでみないとわからないんですがおそらくprivate下に書いても、self.hogeのように書いてしまうとクラスメソッドとして定義されてしまうんだろうなと・・

ではどう描く?ですが

class Hoge

  def self.hoge
    puts 'hoge'
  end

 private_class_method :hoge
end

Hoge.hoge

実行結果は・・

hoge.rb:13:in `<main>': private method `hoge' called for
Hoge:Class (NoMethodError)
ERROR: 1

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

個人的にはこれが好み、要はself.としなければいい

class Hoge

  class << self
    private

    def hoge
      puts 'hoge'
    end
  end
end

Hoge.hoge

こちらもうまくprivate化できていますね

hoge.rb:14:in `<main>': private method `hoge' called for
Hoge:Class (NoMethodError)
ERROR: 1

コメント

タイトルとURLをコピーしました