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!')}}
要得到:
> Foo::Bar::YEP #=> 'Yep!'
解决方案
当您将方法参数包装在括号中时,花括号块将应用于方法调用,而不是列表中的最后一个参数。所以那些{ |klass| ... }
被传递给Object.const_set
not 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!"
推荐阅读
- php - 表单验证和插入数据,使用 php 和 Codeigniter 3.1.11
- javascript - 将对象分配给另一个对象中的键
- scala - google i18 包的手机号码验证问题
- python - Python 不会在 doubleclik 上使用 tkinter 创建窗口
- dropdown - 在 PropertyGrid 中本地化下拉菜单
- ubuntu - 如何增加在 Ubuntu 上运行的 Asterisk 的打开文件描述符
- database - 当它们在不同的时间点被散列时,如何在 3 个不同的服务之间同步用户密码?
- r - Rvest 返回空值
- python - 将 time 命令输出转换为秒
- c - 为什么我不能合并两个文件并将内容存储到 C 中的另一个文件