如何在单例类上定义一个const?

时间:2015-03-14 15:07:03

标签: ruby

我想为对象的单个实例定义一个常量,而不是为对象的所有实例定义。

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)

2 个答案:

答案 0 :(得分:0)

我认为这是不可能的:

  • const_setModule
  • 上定义
  • Ruby在nestingancestors
  • 中查找常量

没有地方可以为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