Rubyリファレンス: Home

private_class_method (Module)

Edit   History

標準クラス・モジュール > Module > private_class_method

mod.private_class_method(name, ...)

private_class_methodメソッドは、クラスやモジュールのクラスメソッドをprivateなメソッドに変えます。引数にはメソッド名をシンボルか文字列で指定します。ここで言う「クラスメソッド」とは、クラスやモジュールの特異メソッドか、ModuleクラスやClassクラスのインスタンスメソッドです。

引数のメソッド名は複数指定できます。定義されていないメソッド名を指定すると例外NameErrorが発生します。戻り値はレシーバ(クラスやモジュール)自身です。

private_class_methodメソッドがよく使われるのは、newの呼び出しを禁止して、インスタンス作成用のメソッドを別に用意するクラスを作る場合です。

class Book
  private_class_method :new
  def self.create
    new
  end
end
 
begin
  p Book.create
  p Book.new
rescue
  p $!
end
#<Book:0x3874350>
#<NoMethodError: private method `new' called for Book:Class>

クラスメソッドがprivateになるのは、「private_class_methodを呼び出したクラスにおいて」です。親クラスのメソッドをサブクラスでprivateにした場合は、サブクラスではprivateになり、親クラスではpublicのままです。

class Klass1
  def self.message() "hello" end
end
class Klass2 < Klass1
  private_class_method :message
end
 
begin
  p Klass1.message
  p Klass2.message
rescue
  p $!
end
"hello"
#<NoMethodError: private method `message' called for Klass2:Class>

関連項目