首页 > 解决方案 > 我如何在动态定义的类的动态定义的子类中动态定义一个常量

问题描述

我如何在动态定义的类的动态定义的子类中动态定义一个常量,像这样,但没有NameError: uninitialized constant Foo::Bar错误:

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

要得到:

> Foo::Bar::YEP #=> 'Yep!'

标签: ruby

解决方案


当您将方法参数包装在括号中时,花括号块将应用于方法调用,而不是列表中的最后一个参数。所以那些{ |klass| ... }被传递给Object.const_setnot to Class.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!"

推荐阅读