ウェブエンジニア珍道中

日々の技術的に関する経験を書いていきます。脱線もしますが助けになれば幸いです。

Rubyでプライベートクラスメソッドを定義する方法

Rubyでクラスの外から呼べないプライベートなクラスメソッドを書く時にちょっとクセがあったのでご紹介します。

方法

こんな感じに書くと宣言できます。パブリックメソッドの hogeから プライベートメソッドの fugaを呼び出してます。

class Hoge
  def self.hoge
    fuga
  end

  def self.fuga
    puts "fuga method is called."
  end

  private_class_method :fuga
end

実行結果

実行結果はこんな感じ

Hoge.hoge
=> fuga method is called.

Hoge.fuga
=> NoMethodError: private method `fuga' called for Hoge:Class

外側からの使用を防げていますね。

解説

private_class_methodというメソッドがあるので、これでクラスメソッドをプライベート化します。「 privateでいいじゃないか」と思われる方もいるかもしれませんが、 privateメソッドはインスタンスメソッドに対してのみ効果があるのでこの後ろにクラスメソッドを定義しても効果はありません。

class Hoge
  private

  def self.hoge
    puts "hoge method is called."
  end
end
Hoge.hoge # 呼べる
=> hoge method is called.

注意点

private_class_methodの位置には注意して下さい。メソッド定義の前に入れるとエラーとなってしまいます。

class Hoge
  private_class_method :hoge

  def self.hoge
    puts "hoge method is called"
  end
end
NameError: undefined method `hoge' for class `Class'  # 怒られる

複数選択もできるので、クラス定義の最後にまとめていれるといいと思います。

class Hoge

  # ...メソッドをいくつか定義

  private_class_method :hoge, :fuga, :foo
end

少しクセがあるように感じますが、方法自体は簡単なのでカプセル化の助けになれば幸いです。 では今回はこのへんで。