gpt4 book ai didi

Ruby:将常量转换为字符串

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

我想将常量 FOO::BAR 转换为字符串 "BAR"

这与constantize相反与 demodulize 非常相似, 除了我期望一个字符串而不是实际的模块引用。

我想我可以让我自己的助手来做这件事,但我无法获得 FOO::BAR 的“字符串化”版本。

理想情况下,我想避免任何第 3 方 gem 。

例子:

class FOO
BAR = {}
end

# this works
FOO #=> FOO
FOO.name #=> "FOO"

# this doesn't
FOO::BAR #=> {}
FOO::BAR.name #=> NoMethodError: undefined method `name' for {}:Hash

最佳答案

不能传递常量,只能传递对象。如果将 FOO::BAR 传递给方法,则不是传递常量,而是传递已分配给 FOO::BAR 的对象,即哈希。

为了从对象本身检索对象已分配给的常量名称,对象必须以某种方式存储该名称。

模块确实存储了它们被分配给的常量名称(Ruby 会在模块首次分配给常量时设置名称)。因为 FOO 是一个模块(类是模块),您可以调用 FOO.name 并返回 "FOO"。但这只是因为对象“知道”它的名字才有效。

在内置对象中,只有 Module(因此 Class)有一个 name以这种方式工作的方法。

可以FOO::BAR 所指的散列实例添加一个name 方法,尽管这可能不是您想要的:

def (FOO::BAR).name
'FOO::BAR'
end

FOO::BAR.name #=> "FOO::BAR"

另一种方法是将常量(实际上是对象)及其模块都传递给方法:

def find_const(mod, obj)
mod.constants.find { |c| mod.const_get(c).equal?(obj) }
end

find_const(FOO, FOO::BAR) #=> :BAR

该方法遍历模块的常量并返回引用传递的对象的(第一个)常量。

关于Ruby:将常量转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35759123/

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