作为初学者,我在Lua中遇到了一个简单的问题:
a = function()
print("hello")
end
b = {125, 116, a()}
print(b[1])
它只应打印125
,但也会打印hello
。即使没有选择表值。
答案 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()'。