require 语句正在覆盖 lua 中的全局变量

A require statement is overwriting global variables in lua

考虑以下两个文件:

a.lua

function x()
    return 1
end

-- return 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 也覆盖我的全局变量有什么好处?

它不能存储为 y,因为您没有 return 它(或者至少您已将其注释掉)。如果您将 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,它执行全局命名空间中的代码并导致覆盖您的函数可能已经有了。