4

class_eval を使用してクラスを拡張したいのですが、元のクラスから定数にアクセスしようとすると、次のエラーが発生しました。

NameError: 初期化されていない定数 HIS_CONSTANT from ./my_module.rb:35:in `show_his_constant' from (irb):4

サンプルプログラムでテストしましたが、動作しません。誰かがこれが機能しない理由を確認して確認できますか? ありがとう!

module MyModule
  puts "start my module"
  def mytest
    puts "mytest"
  end

  module YourModule
    def yourtest
      puts "yourtest"
    end
  end
end

module MyModule
  module YourModule
    module HisModule
      HIS_CONSTANT = 'THIS_IS_A_CONSTANT'
    end
  end
end

module MyModule
  module YourModule
    class HisClass
      include HisModule
      def show_constant
        puts HIS_CONSTANT
      end
    end
  end
end

MyModule::YourModule::HisClass.class_eval do
  def show_his_constant
    puts HIS_CONSTANT
  end
end

ところで、私はこの方法がうまくいくことを知っています:

MyModule::YourModule::HisClass.class_eval do
  def show_his_constant
    puts MyModule::YourModule::HisModule::HIS_CONSTANT
  end
end

しかし、名前空間は既に含まれているはずなので、名前空間を使用してアクセスしたくありません。

4

2 に答える 2

4

コードは 1.9 で記述されているように動作するように見えるため、Ruby 1.8 を使用している必要があります。

1.8では、ブロックが定義されている場所のコンテキストで定数がバインドされていることが問題のようです(self書き始めたときは何でもMyModule::YourModule::HisClass.class_eval)。を使用してself、 が のインスタンスになるまで定数バインディングを遅らせることができます。MyModule::YourModule::HisClassModule.const_get

MyModule::YourModule::HisClass.class_eval do
  def show_his_constant
    puts self.class.const_get(:HIS_CONSTANT)
  end
end

irb 1.8.7> MyModule::YourModule::HisClass.new.show_his_constant
THIS_IS_A_CONSTANT
于 2012-10-22T13:40:40.747 に答える
0

これはどう

MyModule::YourModule::HisClass.class_eval do
  def show_his_constant
    puts self::class::HIS_CONSTANT
  end
end
于 2012-10-22T11:40:39.530 に答える