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 个元素 print
和 LoadResourceFile
。
然后迭代 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
然后你可以全局调用a
和b
。但无论您想要完成什么,都可能有比这更好的方法。
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 个元素 print
和 LoadResourceFile
。
然后迭代 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
然后你可以全局调用a
和b
。但无论您想要完成什么,都可能有比这更好的方法。