为什么即使未选中表中的函数也会调用它

时间:2013-10-05 21:38:22

标签: lua lua-table

作为初学者,我在Lua中遇到了一个简单的问题:

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

b = {125, 116, a()}

   print(b[1])

它只应打印125,但也会打印hello。即使没有选择表值。

2 个答案:

答案 0 :(得分:6)

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

然后创建一个存储在b中的表,其中包含三个表达式:b[1]b[2]是数字,而b[3]是调用存储在a中的函数的结果{1}},根据nil的要求,通过填充将通过常规规则调整为单个值。所以b将是一个只包含两个条目的表,两个数字。但是,在创建a()的值时调用b,打印出“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表格中存储的值的预期用途。

答案 1 :(得分:5)

删除括号应使其起作用:(live @ codepad.org):

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

--[[ Previous code:
  'a()' will execute the function 'a' and will evaluate to its return value
  b = {125, 116, a()}
]]

-- a is now a reference to the function (you could execute it by using: 'b[3]()')
b = {125, 116, a}

print(b[1])

否则,您将使用三个值填充表格:

  • 125

  • 116

  • 并且函数的返回值调用'a()'。