Lua: 从表中定义函数

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

所以我试图使用表名定义一个全局函数

猜测我可以做类似这样的事情 但肯定有更好的方法?

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
点赞
用户14979083
用户14979083

在您的第一个示例中,您正在重新定义变量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 表,它是 lua 的全局环境,在括号中使用字符串定义的所有东西都将全局可用(全局可用的内容在该表中,因此要小心,因为您可以覆盖已定义的其他函数和变量!),即使将其写成普通函数调用。我还确保仅在 k 的类型为字符串时才执行此操作,否则您可能开始定义可以像最后注释掉的调用一样调用的函数。

2021-04-14 08:24:06
用户2858170
用户2858170

这对我来说没有太多意义:

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

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

首先你创建一个带有表元素printLoadResourceFile的表。

然后你对表进行迭代,并使用函数替换表元素。

为什么不简单地这样做:

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()

如果你坚持要在一个表之外拥有这些函数,你可以将它们简单地插入到全局环境表中。

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

然后你可以在全局范围内调用ab。但你尝试实现的任何目标都可能有更好的方法。

2021-04-14 10:30:38