Lua参数未正确扩展

我对Lua还是很新的,或许这是一个初学者问题,但是为什么下面的代码会失败呢?就我所知,foo返回两个参数,由于在Lua中你可以传递任意数量的参数,所以第一个参数传递得很好,但第二次调用断言失败了。

function foo()
 return true, {}
end

function bar(a,b,c)
 assert(type(b)=="table", "Expected table as the second parameter")
 print("Fine")
end

bar(foo())      -- 正常
bar(foo(),true) -- 期望第二个参数为表

https://www.lua.org/cgi-bin/demo

点赞
用户2858170
用户2858170

请阅读 Lua 3.5 参考手册: 3.4 表达式

函数调用和变长表达式都可能返回多个值。如果将函数调用用作语句(参见 §3.3.6),则其返回列表将被调整为零个元素,因此丢弃所有返回值。如果一个表达式被用作一个表达式列表中的最后一个(或唯一一个)元素,则不需要调整(除非该表达式被括在括号中)。在所有其他上下文中,Lua 将结果列表调整为一个元素,只保留第一个值或添加一个单一的 nil 如果没有值。

foo(),true 是一个表达式列表,解析为 true, true,因为 foo() 不是该列表中唯一的表达式,也不是最后一个表达式。 而 true,foo() 会解析为 true, true, {}.

2020-05-24 10:46:01