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