Rubyリファレンス: Home

const_missing (Module)

Edit   History

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

def const_missing(name)
  code...
end

const_missingメソッドは、クラスやモジュールで定義されていない定数(またはクラス)にアクセスしようとしたときに呼び出されます。引数nameには定数名がシンボルで入ります。戻り値を返すと、それが定義されていない定数の値になります。

次の例では、Objectのクラスメソッドとしてconst_missingを定義しています。トップレベルの定数はObjectクラスの定数なので、定義されていないCatBlackを使うとObject.const_missingが呼び出されます。Object.const_missingでは、名前がCat何々の場合はCatクラスを継承したクラスを作成して返します。それ以外の場合は、superを呼び出してNameErrorを発生させます。

class Cat
  def greet() "meow!" end
end
 
def Object.const_missing(name)
  if name.to_s =~ /^Cat/
    const_set(name, Class.new(Cat))
  else
    super
  end
end
 
cat = CatBlack.new
puts cat.greet
 
DogWhite.new rescue p $!
meow!
#<NameError: uninitialized constant DogWhite>

関連項目