gpt4 book ai didi

ruby - 为什么这里klass要和const_get一起使用呢?

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

def self.get(server)
return unless server
server = server.to_s

if klass = @handlers[server]
obj = Object
klass.split("::").each { |x| obj = obj.const_get(x) }
obj
else
try_require('rack/handler', server)
const_get(server)
end
end

code上面,const_get 被用来在这一行中检索某种命名常量:

    klass.split("::").each { |x| obj = obj.const_get(x) }

如果是这样,为什么这里特别使用“klass”?我读过 klass 用于避免 namespace 与“class”关键字的冲突。但在这个例子中,我看不出可能的冲突来自哪里。

最佳答案

变量被称为 klass 而不是 class 因为 if class = @handlers[server]class.split("::") 都会导致语法错误因为,正如您所说,class 是 ruby​​ 中的关键字。

作为一个规则,局部变量不能像关键字一样命名(方法很好,但它们只能用显式接收器调用,这就是为什么你不能写例如 class.name而不是 self.class.name)。

每当解析器在表达式的开头看到标记 class 时,它会将其解释为关键字。

编辑:澄清一下:问题不在于在这里使用 class 会产生歧义,而在于您不能将关键字用作局部变量名。解析器不会这样识别它们。

根据第二条评论进行编辑:klass 在这里用作保存 @handlers[server] 值的局部变量。也可以在没有变量的情况下编写代码(假设 @handlers[server] 的值不能在两次调用之间改变):

if @handlers[server]
obj = Object
@handlers[server].split("::").each { |x| obj = obj.const_get(x) }

我假设代码的作者将 @handles[server] 的值存储在一个变量中,以便 a) 不必键入 @handlers[server] 两次而不是一次,b) 向读者明确该值是一个类,和/或 c) 避免调用 @handlers[] 两次。

YAEdit:为了消除最后一点困惑,以下代码也是等效的:

if foo = @handlers[server]
obj = Object
foo.split("::").each { |x| obj = obj.const_get(x) }

或者:

foo = @handlers[server]
if foo
obj = Object
foo.split("::").each { |x| obj = obj.const_get(x) }

然而,klass 是一个比 foo 更具描述性的变量名称,因此(大概)这就是作者选择将变量命名为 klass 的原因。

关于ruby - 为什么这里klass要和const_get一起使用呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1417015/

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