【问题标题】:A require statement is overwriting global variables in lua一个 require 语句正在覆盖 lua 中的全局变量
【发布时间】:2015-04-23 15:19:28
【问题描述】:

考虑以下两个文件:

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

【问题讨论】:

  • 这个问题不只是“为什么默认是全局的?”的轻微变化

标签: lua include scope require


【解决方案1】:

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

【讨论】:

  • 即使我放了return x,我在b.lua 中的定义也会被覆盖。正如您所说,这可能是由于; require 是一个荣耀的dofile。
  • 对;如果你做return x,你仍然需要在函数中添加“local”或者作为匿名函数返回。
  • @hjpotter92 覆盖是因为函数 x() 在脚本的顺序执行中稍后重新定义。这与在同一个文件中具有函数 x() 后跟另一个函数 x() 没有什么不同。最新的定义是剩下的。 'return'的使用与否与它无关。
猜你喜欢
  • 1970-01-01
  • 2014-09-27
  • 2019-02-27
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
相关资源
最近更新 更多