gpt4 book ai didi

ruby-on-rails - 将类动态解析为全局范围

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:49 26 4
gpt4 key购买 nike

我需要将类的引用保存到散列中:

@hash['foo'] = bar if bar.is_a?(Class)

上面这段代码在我的/lib目录下,并不是每次都自动加载,bar通常是一个自动加载的类。为了避免在我重新加载!我的代码时出现“xxx 的副本已从模块树中删除但仍处于事件状态”错误,我正在尝试解析 bar 到全局范围,即:在类名前添加 ::(Baz 正在变为 ::Baz)。

我不确定如何在将类转换为字符串、在:: 前面添加,然后将其转换回类的情况下动态执行此操作。

最佳答案

将常量分配给散列时,常量在分配时解析:(不是特定于散列的,这就是常量的工作方式)

hash = {}
A = 1
hash[:a] = A
#=> 1 # <- 1 is being assigned, not A

A = 2
hash[:a]
#=> 1

解决它的一种方法是存储常量的名称:

hash = {}
A = 1
hash[:a] = 'A'
#=> 'A'

并通过 const_get 解决它/constantize :

A = 2
Object.const_get(hash[:a])
#=> 2

这也适用于嵌套常量:

hash[:pi] = 'Math::PI'
Object.const_get(hash[:pi])
#=> 3.141592653589793

如果您的对象恰好是命名类(或模块),您可以通过 Module#name 检索它的名称:

hash[:lazy_enum] = Enumerator::Lazy.name
#=> "Enumerator::Lazy"

Object.const_get(hash[:lazy_enum])
#=> Enumerator::Lazy

另一种方法是使用 proc它引用了它的 block 中的常量:

hash = {}
A = 1
hash[:a] = -> { A }
#=> #<Proc:0x00007fc4ba05f510@(irb):10 (lambda)>

调用 block 时将解析常量:

A = 2
hash[:a].call
#=> 2

关于ruby-on-rails - 将类动态解析为全局范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50922777/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com