Lua中如何使用模块名作变量名且不影响模块调用?
解决方案:保留原模块/全局表功能的同时复用变量名
这个问题我之前也碰到过,其实核心就是Lua的变量作用域查找规则在搞事情——当你在局部作用域定义了和全局表/模块同名的变量时,Lua会优先使用局部变量,自然就找不到原来的表或模块了。咱们可以用几个简单的技巧绕开这个限制:
1. 针对math这类全局表的处理
你只需要在覆盖math变量之前,先把全局的math表存到另一个局部变量里,之后用这个别名调用原有的方法就行:
-- 先把全局math表存到别名里 local global_math = math -- 现在可以放心把math设为其他值 local math = 1 + 1 -- 用别名调用原有的random方法 print(global_math.random(1, 10)) -- 正常输出随机数
如果你不想额外起别名,也可以直接通过全局环境表_G来访问原有的math:
local math = 1 + 1 print(_G.math.random(1, 10)) -- 同样有效
不过更推荐第一种方式,因为局部变量的访问效率比全局环境更高。
2. 针对coord、offset这类模块的处理
思路和上面一致,要么在导入模块时直接用别名,要么先把模块引用存到别名后再复用原变量名:
方式一:导入时直接用别名
如果你的模块是通过require导入的,直接在导入阶段就指定别名:
-- 用别名c代替coord模块 local c = require("coord") -- 现在coord可以当普通变量用了 local coord = "自定义变量值" -- 用别名调用模块方法 print(c.get())
方式二:先存别名再复用变量名
如果模块已经在当前作用域中了,先把它存到别名里:
-- 先保存模块引用到别名 local c = coord -- 复用coord作为变量名 local coord = {x = 100, y = 200} -- 用别名调用模块方法 print(c.get())
本质上都是利用Lua的变量作用域规则,把原有的表/模块引用“转移”到另一个局部变量中,这样原名字就可以自由复用啦。
内容的提问来源于stack exchange,提问作者Gallaxhar
相关产品推荐
相关产品推荐

