Mark24
记录灵感、技术、思考
笔记:Ruby常量查找实验
导航关联
常量查找实验
class G
G_NAME = 'Find G'
end
module A
module B
module D
end
end
end
module A
module B
class C < G
pp Module.nesting
pp A
pp B
pp C
pp D
pp G
pp G_NAME
end
end
end
# output>>>>
# [A::B::C, A::B, A]
# A
# A::B
# A::B::C
# A::B::D
# G
# "Find G"
参考 《Ruby源码剖析》 对常量查找的算法描述。这里可以应验
“Find G” 之前,都是在词法作用域上搜索。
module A
module B
module D
end
end
end
如果我们把 这段搬运到最后面。那就找不到D了。因为词法作用域发生了改变。会报错。
“Find G” 能被打印,说明后面开始在 超类链 上进行搜索。
小结:
不难看出,为了自己的幸福,还是尽量用 完整链路去表达 A::B::C 如果是 最外侧根处开始使用 ::A ,如果是使用了系统模块,那就 Module.nesting 这样绝对调用。 看着清晰一点。尤其是使用第三方包的时候。
这里的经验也符合Web前端对于 DOM里面方法的引用,尽量保持完整,比如 window.document 而不是直接 document ,这也是一个Lint。
因为如果是短名字,你不晓得它会搜索到哪里去了。这可能是个潜在的威胁。