一条 Lua 的 require 语句正在覆盖全局变量。

考虑以下两个文件:

a.lua

function x()
    return 1
end

-- 返回x

b.lua

function x()
    return 2
end

print( x() )
local y = require "a"
print( _G.x(), y )
print( x(), y() )

当我执行 b.lua 后,会收到以下输出:

2
1   function: 0024B710
1   1

在我看来,这是错误的。来自 a.lua 的函数 x 应该被存储为 y,而不是覆盖 b.lua 中的全局变量。我知道我可以在 a.lua 中使用 local 关键字来纠正这种行为。

我只是想知道这是否是不希望的行为;如果是,如果 require 也会覆盖我的全局变量,有什么好处?

点赞
用户1442917
用户1442917

它不能被存储为 y,因为你没有返回它(或者至少将其注释掉了)。如果你将 a.lua 代码更改为 return function() return 1 end,它应该会按照你的预期工作(或者根据你的建议添加 local)。

通常,这就是为什么你通常会看到以下模式:

local function a() end
local function b() end
return {a = a, b = b}

然后你可以像这样使用它:local y = require "mymodule"; print(y.a(), y.b()) 或类似的方式。

就是否这是可取的行为而言,我认为这是 require 成为一种吹嘘的 dofile 的效果,它在全局命名空间中执行代码并导致覆盖你可能已经有的函数。

2015-02-22 05:37:33