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

时间:2017-09-19 14:05:51

标签: lua lua-table lexical-scope

我有以下场景,其中代码的位置不会改变。如何修改此代码以修复错误而不移动函数和表变量。我是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"]](); 

2 个答案:

答案 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())。您的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' 

当然,你也可以移动"运行一个"下来并编码就像"功能b"。这将使ftable = { }位于顶部。

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

我还想重新讨论@lhf said

  

Lua中没有声明,只有定义。

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

也是如此