【问题标题】:Making local the _G variables & execute location将_G变量和执行位置设为本地
【发布时间】:2022-01-27 15:28:39
【问题描述】:

第一个疑问

例如,next 可以很容易地声明为本地

local next = next

但是以table.insert 为例呢?

在本地变量上创建一个带有 table.insert 的匿名函数真的可行吗?

第二个疑问

是否可以知道函数从哪里执行?这让我们回到我的第一个疑问,我如何确保 _G 变量在本地执行

真的问,因为除了默认的 _G 变量之外,我的项目中还添加了一些变量

【问题讨论】:

  • 是否有可能知道函数从哪里执行?debug.traceback()

标签: lua


【解决方案1】:

但是例如table.insert 会怎么样?

local table = table

如何确保 _G 变量在本地执行

还是一样的函数值。您刚刚添加了对它的本地引用。可以更快地查找局部变量。您必须经常调用一个函数才能真正从中受益。

这是固执己见,但大多数程序员都认同这种观点:

不要将时间浪费在过早的优化上。不要为您遇到的每个全局创建本地引用。

【讨论】:

    【解决方案2】:

    使用 load() 你可以给 Lua 代码一个自己的环境。
    通常(没有自己的环境)使用 _G (5.1) 或 _ENV (自 5.3)。
    您可以玩的示例...

    > _VERSION
    Lua 5.4
    > load('do local tab, concat, insert = {}, concat, insert insert(tab, "Hello World!") return concat(tab) end', 'own_env', 't', {concat = table.concat, insert = table.insert})()
    Hello World!
    > load('do local tab, concat, insert = {}, concat, insert insert(tab, "Hello World!") return concat(tab) end', 'own_env', 't')()
    [string "own_env"]:1: local 'insert' is not callable (a nil value)
    stack traceback:
            [string "own_env"]:1: in main chunk
            (...tail calls...)
            [C]: in ?
    

    来源:https://www.lua.org/manual/5.4/manual.html#pdf-load

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多