在写一个 RPC lib 的时候,发现同一个文件如果用不同的 require 名字加载,会导致加载出不同的 lua 文件实例。

上图中这两个并不是同一个 lua table——尽管它们来自同一个文件,且都是通过 packpath 找到的。

也就是说,接口2 注册的回调,在接口1 里面并不是同一个,因为它们指向的是两个不同的 lua table。

结论

Lua 的 require 本身是通过 key 来标识是否重复加载的,而不是通过具体的文件路径来判断。因此,必须保持各处 require 这个文件时所用的名字完全一致——即使是通过 packpath 添加了搜索路径,require 的 key 字符串也要保持一致,否则同一个文件会被当作不同模块重复加载。