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

Vit*_*vas 5 lua lua-table

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

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

b = {125, 116, a()}

   print(b[1])
Run Code Online (Sandbox Code Playgroud)

它应该只打印125,但也打印hello.即使未选择表值.

RBe*_*eig 6

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

然后创建一个存储在b其中的表,它有三个表达式:b[1]并且b[2]是数字,并且b[3]是调用存储的函数的结果,a通过填充按照惯例将其调整为单个值nil.所以b将是一个只包含两个条目的表,两个数字.然而,a()在创造b价值时被称为"你好".

最后,您调用print(b[1])哪个打印预期的数字.

这完全解释了你看到的输出.由于这可能不是您期望看到的输出,您可以通过多种方式解决此问题.

例如,声明a返回"hello"而不是调用print.

a = function() return "hello" end
Run Code Online (Sandbox Code Playgroud)

然后在构造存储的表时调用它将b不会打印任何内容,b并将获得第三个元素,字符串"hello".

或者,您可以b通过省略导致它被调用的括号来存储函数.

b = {125, 116, a}
Run Code Online (Sandbox Code Playgroud)

再次,b保持一个由三个元素组成的表.在这种情况下,b[3]是打印"hello"的功能.

您选择做什么完全取决于您对表中存储的值的预期用途b.


Com*_*eek 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])
Run Code Online (Sandbox Code Playgroud)

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

  • 125,

  • 116

  • 和函数的返回值调用'a()'.