我想使用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
但我不想使用命名空间来访问,因为它应该已经包含在内。
答案 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