当稍后声明函数时,如何在 lua table 中将函数作为字段值?

How to have function as field value in a lua table, when the function is declared at a later point?

我有以下情况,其中代码的位置不应更改。如何修改此代码以在不移动函数和 table 变量的情况下修复错误。我是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"]](); 

你不能那样做。 Lua 中没有声明,只有定义。使用前需要先定义变量。

你可以做的是在ftable中注册函数的名称,然后在使用它们之前固定值:

ftable = {
  ["a"] = true,
  ["b"] = true,
}
...
for k,v in pairs(ftable) do ftable[k]=_G[k] end

此代码假定您的函数是全局定义的。

Lua的table声明和函数定义(以及函数调用语法)非常灵活。您可以使用字段键作为标识符而不是索引语法,前提是该键是字符串并且也是有效的标识符({ a = a }ftable.a())。您的 ab 键似乎就是这种情况。也可以用函数定义语句(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' 

当然,你也可以把"function a"下移,像"function b"一样编码。这将使 ftable = { } 位于顶部。

与您的代码有一处不同。全局变量 b 不再设置为函数。在大多数情况下,这将被视为一种优势。

我还要再重申一下,

There are no declarations in Lua, only definitions.

函数定义(在一般情况下)是一个表达式。评估时,它会产生一个函数值。各种类型的语句都可以将值赋给变量或字段,function ftable.b()….