Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将类动态解析为全局范围_Ruby On Rails_Ruby_Class_Autoload - Fatal编程技术网

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