Ruby on rails 将类动态解析为全局范围
我需要将类的引用保存到哈希:Ruby on rails 将类动态解析为全局范围,ruby-on-rails,ruby,class,autoload,Ruby On Rails,Ruby,Class,Autoload,我需要将类的引用保存到哈希: @hash['foo'] = bar if bar.is_a?(Class) 上面的代码位于我的/lib目录中,它不是每次都自动加载的,而bar通常是一个自动加载的类。为了避免在重新加载时出现“xxx的副本已从模块树中删除,但仍处于活动状态”错误我的代码,我试图将条形图解析为全局范围,即:在类名之前添加:(Baz正在变成::Baz) 我不知道如何动态地执行这个,而不必将类转换为字符串,预先编写:,然后将其转换回类。将常量分配给哈希时,常量会在分配时解析:(不是哈希
@hash['foo'] = bar if bar.is_a?(Class)
上面的代码位于我的/lib
目录中,它不是每次都自动加载的,而bar
通常是一个自动加载的类。为了避免在重新加载时出现“xxx的副本已从模块树中删除,但仍处于活动状态”错误代码>我的代码,我试图将条形图
解析为全局范围,即:在类名之前添加:
(Baz
正在变成::Baz
)
我不知道如何动态地执行这个,而不必将类转换为字符串,预先编写
:
,然后将其转换回类。将常量分配给哈希时,常量会在分配时解析:(不是哈希特定的,这只是常量的工作方式)
并通过/:
这也适用于嵌套常量:
hash[:pi] = 'Math::PI'
Object.const_get(hash[:pi])
#=> 3.141592653589793
如果对象恰好是命名类(或模块),则可以通过以下方式检索其名称:
另一种方法是使用引用其块中常量的:
hash = {}
A = 1
hash[:a] = -> { A }
#=> #<Proc:0x00007fc4ba05f510@(irb):10 (lambda)>
常数在赋值时解析。就像
A=1;散列['a']=a;A=2
–常量和散列随后引用不同的对象。添加:
不会改变任何事情。我理解。那么我该如何克服我问题中提到的错误呢?要么存储常量的名称并使用const_get
/constantize
(这是您试图避免的),要么使用proc,例如@hash['foo']=->{Baz}
,可以通过@hash['foo']动态解析。调用看起来相当公平。你能把它作为答案提交吗?我愿意接受它!
A = 2
Object.const_get(hash[:a])
#=> 2
hash[:pi] = 'Math::PI'
Object.const_get(hash[:pi])
#=> 3.141592653589793
hash[:lazy_enum] = Enumerator::Lazy.name
#=> "Enumerator::Lazy"
Object.const_get(hash[:lazy_enum])
#=> Enumerator::Lazy
hash = {}
A = 1
hash[:a] = -> { A }
#=> #<Proc:0x00007fc4ba05f510@(irb):10 (lambda)>
A = 2
hash[:a].call
#=> 2