我想为对象的单个实例定义一个常量,而不是为对象的所有实例定义。
class MyTest
def call
Foo
end
end
t = MyTest.new
t.call # => NameError (as expected)
t.singleton_class.class_eval do
const_set 'Foo', 'foo'
end
t.singleton_class::Foo # => 'foo'
t.call # => NameError
为什么const查找不包含对象singleton类中定义的const?
这是另一次尝试:
Dog = Class.new { def call; Bark; end }
d = Dog.new
d.call # => NameError (expected)
d.singleton_class.const_set('Bark', 'woof')
d.call # => NameError (not expected)
答案 0 :(得分:0)
我认为这是不可能的:
const_set
在Module
nesting
和ancestors
没有地方可以为MyTest
实例
class MyTest
def call
puts (Module.nesting + Module.ancestors).uniq.inspect
end
end
MyTest.new.call
# => [MyTest, Module, Object, Kernel, BasicObject]
答案 1 :(得分:0)
我认为this comment是正确的 - t.singleton_class.class_eval
首先获得singleton_class
的{{1}},然后t
获取该单身类的内容'类。
而你想要的是在那个单例类的实例上定义常量,如下所示:
eval
之后,t.singleton_class.instance_eval do
Foo = 'foo'
end
会返回t.call
。