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

时间:2015-02-22 04:19:00

标签: lua include scope require

考虑以下两个文件:

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

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

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

1 个答案:

答案 0 :(得分:3)

它不能存储为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的效果,它在全局命名空间中执行代码,导致覆盖您可能已经拥有的功能。