为什么klass与const_get一起使用?

uzo*_*uzo 2 ruby

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
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,const_get用于在此行上检索某种命名常量:

    klass.split("::").each { |x| obj = obj.const_get(x) }
Run Code Online (Sandbox Code Playgroud)

如果是这样,为什么klass特别在这里使用?我读过这个klass用于避免命名空间与" class"关键字冲突.但在这个例子中,我没有看到可能发生冲突的地方.

sep*_*p2k 5

该变量称为克拉斯而不是类,因为两者if class = @handlers[server]class.split("::")因为,如你所说,类是红宝石关键字会造成语法错误.

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

每次解析器class在表达式的开头看到令牌时,它都会将其解释为关键字.

编辑:澄清:问题不在于这里的类的使用是不明确的,而是你根本不能使用关键字作为局部变量名.解析器不会识别它们.

编辑以响应第二条评论:klass此处用作保存值的局部变量@handlers[server].代码也可以在没有变量的情况下编写(假设@handlers[server]两个调用之间的值不能改变):

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

我假设代码的作者@handles[server]将变量的值存储到a)不必输入@handlers[server]两次而不是一次,b)向读者说明该值是一个类,和/或c)以避免必须打@handlers[]两次电话.

YAEdit:希望删除最后一点混淆,以下代码也是等效的:

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

要么:

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

然而,klass是一个比foo更具描述性的变量名,所以(大概)是作者选择命名变量klass的原因.