gpt4 book ai didi

ruby - 有什么方法可以捕获声明中常量的名称?

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

我有课。我们称它为 SomeClass:

class SomeClass
end

我不想以常规方式定义此类的实例,而是想使用常量来定义它们:

MyConstant = SomeClass.new

我也希望能够捕获某个类设置的常量的名称,就像标准 ruby​​ 类使用 .class 方法所做的一样。

MyConstant.name #-> "MyConstant"

我希望能够这样做以从某个类的所有实例中呈现更好的错误消息,如下所示:

class SomeClass 
def display_error_message
"Error, some class #{self.name} has a problem"
end
end

MyConstant.display_error_message
#-> "Error, some class MyConstant has a problem"

有什么方法可以做到这一点?

编辑


这里有一个例子来阐明我的目标。

(枚举是我正在创建的类的名称,它的作用类似于 Swifts 的“枚举”类型。基本上它设置了一个预定义的选项列表(:pepperoni,:sausage,:mushroom)和 raw_value (“Pepperoni”、“Sausage”、“Mushroom”。)显然,在此示例中,将符号转换为 UpperCamel 大小写字符串的散列或简单算法可能有效,但实际上枚举类会做更多的事情,但这个例子说明了它的要点。

class Pizza 
attr_reader :topping

Toppings = Enum.new do
option(:pepperoni).set("Pepperoni")
option(:sausage).set("Sausage")
option(:mushrooms).set("Mushrooms")
end

def set_topping(symbol)
@topping = Toppings[symbol]
end
end

pizza = Pizza.new

### Happy Case
pizza.set_topping(:pepperoni)

### Sad Case (Error message shown below is what I'm trying to figure out)
pizza.set_topping(:spinach)
#-> Error. enum Toppings has no option spinach

最佳答案

变量只是引用对象的一种方式,变量名无关紧要。如果你说 X = YY 恰好是一个类,那么 Y 类已经有了名称 "Y",所以你不能改变它。

就 Ruby 而言,XY 是无法区分的。

如果你想改变名字,你可以创建一个子类,即使那个子类没有做任何不同的事情:

X = Class.new(Y)
X.name
# => "X"
Z = X
Z.name
# => "X"

这种方式可以正确保留名称,但仅限于初始化的上下文中。我认为 Ruby 做了一些偷偷摸摸的事情,如果一个新类被分配给一个常量,它会分配一个名称,但对于普通变量它不会:

x = Class.new(Y)
x.name
# => nil

所以这是一个特例。

这里的关键是,确实影响名称的子类与不影响名称的变量引用之间存在巨大差异。

这里还发生了一些其他奇怪的事情,因为类似乎以某种方式“知道”它何时被分配给某个东西,如果那个东西是常量,它会为自己窃取常量的名称:

z = Class.new
z.name
# => nil
Z = z
z.name
# => "Z"

正如他们在编程中所说:“Wat?”

关于ruby - 有什么方法可以捕获声明中常量的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50612766/

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