Lua:从 table 定义函数

Lua: define functions from a table

NativeTable = {
    ["print"] = {},
    ["LoadResourceFile"] = {}
}

for k, v in pairs(NativeTable) do
    k = function(...)
        print("test")
    end
end

这将导致在 NativeTable 中定义它们,而不是作为全局函数

print = function(...)
    print("test")
end
LoadResourceFile = function(...)
    print("test")
end

所以我试图用 table 名称定义一个全局函数

我猜我可以这样做 但是一定有更好的方法吗?

NativeTable = {
    ["test"] = {},
    ["LoadResourceFile"] = {}
}

local function OverWriteFunction(FuncName, Func)
    local Base = [[ = function(...)
    print("jaa")
end
    ]]
    local Final = FuncName .. Base
    return Final
end

for k, v in pairs(NativeTable) do
    load(OverWriteFunction(k))()
end

在您的第一个示例中,您重新定义了变量 k,它在 for 循环内是局部变量,因此在您定义它的那个循环之外将无法使用。

你的第二个例子是你绝对应该尽可能避免的事情,因为在字符串中定义代码并稍后加载它意味着,即使只有语法错误也不会在“编译”时显示,但只有当确切的部分被执行。尤其是,当您连接本应是代码的字符串时,如果您尝试将其通用化,您将面临错误地将某些内容粘合在一起的风险。

如果我理解正确你想要达到的目标,我会说,它可能是这样的:

NativeTable = {
    ["test"] = {},
    ["LoadResourceFile"] = {},
    [3] = {}
}

for k, v in pairs(NativeTable) do
    if type(k) == "string" then
        _G[k] = function(...)
            print("output")
        end
    end
end

test()
LoadResourceFile()
-- _G[3]()

输出:

output
output

我在这里做的是使用 _G table 这是 lua 的全局环境,你在那里用括号中的字符串定义的所有东西都是全局的可用(全局可用的在 table 内部,所以要小心,因为您可以覆盖您定义的其他函数和变量!),即使将其编写为普通函数调用也是如此。我还确保仅在 k 的类型为字符串时执行此操作,否则您可以开始定义可以像上次注释掉的调用一样调用的函数。

这对我来说意义不大:

NativeTable = {
    ["print"] = {},
    ["LoadResourceFile"] = {}
}

for k, v in pairs(NativeTable) do
    k = function(...)
        print("test")
    end
end

首先,您创建一个 table,其中包含 table 个元素 printLoadResourceFile

然后迭代 table 并用函数替换 table 元素。

为什么不简单地这样做:

myTable = {
  a = function() print("I'm function a") end,
  b = function() print("I'm function b") end,
}

myTable = {}
myTable.a = function () print("I'm function a") end

然后你可以像这样调用全局函数:myTable.a()

如果您坚持要在 table 之外使用这些函数,您只需将它们插入全局环境 table。

for k, v in pairs(myTable) do _G[k] = v end

然后你可以全局调用ab。但无论您想要完成什么,都可能有比这更好的方法。