为什么在 Lua 中将模块加载到本地或全局变量中会产生不同的结果?

模块 lfs 看起来可以不分配到本地或全局变量中就可以访问:

> lfs = require 'lfs'
> print(type(lfs))
table
> local lfs = require 'lfs'
> print(type(lfs))
table

md5 却不然:

> md5 = require 'md5'
> print(type(md5))
table
> local md5 = require 'md5'
> print(type(md5))
nil

这种差异的原因是什么?

点赞
用户1442917
用户1442917

这是因为 lfs 调用了 lua_setglobal(L, LFS_LIBNAME);,设置了全局的 lfs 变量,所以即使你使用 local lfs = require "lfs",它仍然可以使用。md5 不会设置全局变量。

需要注意的是,如果你从 Lua 解释器中运行这个代码,你需要考虑 local 变量只在同一行中可见的限制,所以运行 > local a = 1>print(a) 会显示 nillfs 并不是 nil,因为它还隐式地设置了相同名称的全局变量(如上所述)。如果你运行 local mylfs = require "lfs",然后 print(mylfs)lfsmd5 的结果将相同。

2020-03-10 02:14:54