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"关键字冲突.但在这个例子中,我没有看到可能发生冲突的地方.
该变量称为克拉斯而不是类,因为两者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的原因.
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |