我有以下场景,其中代码的位置不会改变。如何修改此代码以修复错误而不移动函数和表变量。我是Lua新手,只用了4天
function a()
print("function a");
end
ftable = {
["a"] = a,
["b"] = b
};
function b()
print("function b");
end
ftable["a"](); -- prints 'function a'
ftable["b"](); -- attempt to call field 'b' (a nil value)
更新:使用以下机制可以执行此操作。
function a()
print("function a");
end
ftable = {
["a"] = a,
["b"] = "b"
};
function b()
print("function b");
end
ftable["a"](); -- prints 'function a'
_G[ftable["b"]]();
答案 0 :(得分:3)
你不能这样做。 Lua中没有声明,只有定义。您需要在使用它们之前定义变量。
您可以做的是在ftable
中注册函数的名称,然后在使用之前修复这些值:
ftable = {
["a"] = true,
["b"] = true,
}
...
for k,v in pairs(ftable) do ftable[k]=_G[k] end
此代码假定您的函数是全局定义的。
答案 1 :(得分:2)
Lua的表声明和函数定义(以及函数调用语法)非常灵活。您可以使用字段键作为标识符而不是索引语法,前提是键是字符串并且也是有效的标识符({ a = a }
和ftable.a()
)。您的a
和b
密钥就是这种情况。您还可以使用函数定义语句(function ftable.b
...)进行字段赋值。
function a()
print("function a")
end
ftable = {
a = a
}
function ftable.b()
print("function b")
end
ftable.a() -- prints 'function a'
ftable.b() -- prints 'function b'
当然,你也可以移动"运行一个"下来并编码就像"功能b"。这将使ftable = { }
位于顶部。
与您的代码有一点不同。全局变量b
不再设置为该函数。在大多数情况下,这将被视为一种优势。
我还想重新讨论@lhf said,
Lua中没有声明,只有定义。
函数定义(在一般情况下)是一个表达式。评估时,它会生成一个函数值。各种类型的语句可以将值赋给变量或字段,function ftable.b()
...。