QA@IT

Ruby: module_eval (class_eval) で定数にアクセスできない

3521 PV
module M
  Constant = "hoge"

  def self.start &block
     self.module_eval(&block)
  end
end

M.start do
  p Constant
end

というコードを書いたのですが、p Constantの部分でuninitialized constant API (NameError)
となってしまいConstantを取得できません...

どうすればエラーを吐かれずにmodule内の定数を取得できるのでしょうか?
基礎的なことかもしれませんが回答お願いします。

環境:

  • OS X 10.9 Mavericks
  • Ruby 2.1.1p76
    • rbenv使用

回答

「ブロックが与えられた場合には、定数とクラス変数のスコープはブロックの外側のスコープになります。 」とありました。

以下のように書くことで、うまくゆきました。

module M
  Constant = "hoge"

  def self.start &block
     self.module_eval(&block)
  end
end

M.start do
  p M::Constant
end
# >> "hoge"
編集 履歴 (0)
  • なるほど、スコープが変わってしまうのですね
    ありがとうございます!
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。