我如何动态定义动态定义的类的动态定义子类内的常量

okl*_*liv 2 ruby

我如何动态定义动态定义的动态定义类的子类内部的常量,如下所示,但没有NameError: uninitialized constant Foo::Bar错误:

Object.const_set('Foo',Class.new) {|klass| klass.const_set('Bar', Class.new){|subklass| subklass.const_set(:YEP,'Yep!')}}
Run Code Online (Sandbox Code Playgroud)

要得到:

> Foo::Bar::YEP #=> 'Yep!'
Run Code Online (Sandbox Code Playgroud)

Sim*_*ime 5

在括号中包装方法参数时,花括号块将应用于方法调用,而不是列表中的最后一个参数.所以这些{ |klass| ... }都被传递给Object.const_setClass.new.如果你在块之后移动那个紧密括号它会工作,因为块传递给Class.new而不是Object.const_set:

Object.const_set('Foo',Class.new { |klass|
  klass.const_set('Bar', Class.new { |subklass|
    subklass.const_set(:YEP,'Yep!')
  })
})
Foo::Bar::YEP # => "Yep!"
Run Code Online (Sandbox Code Playgroud)