为什么即使未选中表格中的函数也被调用?

作为一个入门者,在 Lua 中我有一个相对简单的问题:

a = function()
   print("hello")
end

b = {125, 116, a()}

   print(b[1])

它应该只打印 125,但也打印了 hello。即使没有选择表值也是如此。

点赞
用户603003
用户603003

移除括号应该就可以让它工作了: (live @ codepad.org):

a = function()
   print("hello")
end

--[[ 原有代码:
  'a()' 会执行函数 'a' 并返回其返回值
  b = {125, 116, a()}
]]

-- 现在 a 是对函数的引用(你可以使用 'b[3]()' 来执行它)
b = {125, 116, a}

print(b[1])

否则你会用三个值填充你的表格:

  • 125,
  • 116
  • 和函数调用 'a()' 的返回值。
2013-10-05 21:46:01
用户68204
用户68204

如写所示,您创建了一个分配给a的函数,该函数不带参数并且不返回任何内容;它具有打印“hello”的副作用。

然后,您创建了一个存储在b中的表,其中有三个表达式:b[1]b[2]是数字,而b[3]是调用存储在a中的函数的结果,该函数将根据需要使用nil填充来调整为单个值。所以b将是一个仅包含两个条目的表,均为数字。但是,在创建b的值时调用了a(),这将打印“hello”。

最后,您调用print(b[1]),它会打印预期的数字。

这充分解释了您看到的输出。由于那可能不是您希望看到的输出,因此您可以通过多种方式来修复它。

例如,声明a返回“hello”,而不是调用print

a = function() return "hello" end

然后在构建存储在b中的表时调用它将不会打印任何内容,并且b将获取第三个元素,即字符串“hello”。

或者,您可以存储按原样编写的函数在b中,省略导致其被调用的括号。

b = {125, 116, a}

同样,b保存的是一个由三个元素组成的序列。在这种情况下,b[3]是打印“hello”的函数。

您选择哪种方式完全取决于您对存储在b表中的值的预期用途。

2013-10-05 22:50:53