评估模块中的常量

时间:2014-03-18 01:35:33

标签: ruby class module constants

使用class关键字时,在该类中进行常量查找。在下文中,分配给:bar的内容为B::A,而不是::A

A = :foo
class B
  A = :bar
end
A # => :foo

但是在方法定义中,我无法使用关键字class,如果我使用class_evalmodule_evalinstance_eval等内容来评估一个块,那么所提到的常数将在主要环境中评估如下。

class B; end
def foo &pr
  B.class_eval(&pr)
end
foo{A = :bar}
A # => :bar

有没有办法将块传递给方法并在某个类/模块中对其常量进行求值?

2 个答案:

答案 0 :(得分:0)

我想我知道你在问什么(虽然我还不明白你为什么需要)。您可以将该类返回到块中,因此至少您明确了解正在发生的事情:

def foo &pr
  yield self.class
end

my_object.foo {|klass| klass::A = :bar }

答案 1 :(得分:0)

Module#const_set似乎就是你想要的:

class B; end

def foo(klass, konstant, val)
  klass.const_set(konstant, val)
end

foo(B, "A", :bar)

B::A #=> :bar
A    #=> NameError: uninitialized constant A

...但由于你没有提及,我希望我误解了这个问题。