在ruby中使用class_eval时,如何访问原始类中的常量?

时间:2012-10-22 10:24:31

标签: ruby-on-rails ruby ruby-on-rails-3

我想使用class_eval扩展一个类,并且在尝试从原始类访问常量时,我​​得到一个错误说:

NameError:未初始化的常量HIS_CONSTANT     来自./my_module.rb:35:在'show_his_constant'中     来自(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

但我不想使用命名空间来访问,因为它应该已经包含在内。

2 个答案:

答案 0 :(得分:4)

您必须使用ruby 1.8,因为您的代码似乎与1.9中所述的一样。

在1.8中,问题似乎是常量在定义块的上下文中被绑定(当你开始编写self时)MyModule::YourModule::HisClass.class_eval。您可以使用Module.const_get延迟常量绑定,直到self成为MyModule::YourModule::HisClass的实例。

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

答案 1 :(得分:0)

这个怎么样

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