在Lua中如何使用表索引调用存储在表中的函数?

我是一个Lua新手/3天,正在尝试像下面的代码一样调用存储在Lua表中的函数

function sayhello()
  return "hello";
end

function saygoodbye()
  return "goodbye";
end

funct = {
  ["1"] = sayhello,
  ["2"] = saygoodbye,
  ["name"] = "funct"
};

function say(ft,index)
  local name = ft.name;
  print("\nName : " .. name .. "\n");
  local fn = ft.index;
  fn();
end

say(funct,"1"); --  尝试调用本地'fn'(空值)
say(funct,"2"); --  尝试调用本地'fn'(空值)
                --  Name funct在两种情况下都打印出来

我得到了错误_attempt to call local 'fn' (a nil value)_ 这两个say调用都打印出了名字功能。

感谢

点赞
用户107090
用户107090

你需要使用

fn = ft[index]

因为

fn = ft.index

等同于

fn = ft["index"]
2017-09-19 03:09:32
用户2032943
用户2032943

这被描述为《Programming in Lua》中一个常见的初学者错误。如果你犯了错误,那么你就开始学习了。@lhf 的答案是正确的,但我只是想为那些访问这个问题的其他人强调这本优秀的书《Programming in Lua》(https://www.lua.org/pil/2.5.html)。

初学者常见的错误是混淆 a.x 和 a[x]。第一种形式表示 a["x"],即一个由字符串“x”索引的表。第二种形式是一个由变量 x 的值索引的表。看一下它们之间的区别:

a = {}
x = "y"
a[x] = 10                 -- 将 10 存储在 "y" 字段中
print(a[x])   --> 10      -- "y" 字段的值
print(a.x)    --> nil     -- "x" 字段的值(未定义)
print(a.y)    --> 10      -- "y" 字段的值
2017-10-01 07:11:51