笔记:Ruby常量查找实验

导航关联

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。

因为如果是短名字,你不晓得它会搜索到哪里去了。这可能是个潜在的威胁。

Mark24

Everything can Mix.