我们知道Lua支持多个变量在一个语句中赋值,也支持一个函数同时返回多个值,但是这两者组合起来会怎么样呢?
多说无宜,测试开始。
仅有函数的情况
首先是我们的多返回函数add,有两个参数,固定返回1和0,然后是四个变量,bcde。
function add()
return 1,0
end
local b,c,d,e = add(),add()
print(b) -- 1
print(c) -- 1
print(d) -- 0
print(e) -- nil
结果会发现变量e没有被赋值。
我这里特别将两个返回值设得不同,被赋值为第一个返回值的是1,第二个返回值的是0,如果所有函数都会展开,那么变量c肯定为0,但实际上是1,所以很容易知道的是,后一个add被展开了,第一个没有被展开。
与变量混合的情况
在上面的基础上,增加一个变量,把它放在第二个add后面。
a = 5
function add()
return 1,0
end
local b,c,d,e = add(),add(),a
print(b) -- 1
print(c) -- 1
print(d) -- 5
print(e) -- nil
如果你以为第二个add的返回值还是会被展开那就错了,实际上这时候因为第二个add之后也有一个,
所以它也不会被展开。
结论
当函数在赋值语句的右边时,只有在最后一个,
之后的函数才会把所有的返回值展开,所有后面有,
的函数的返回值都不会展开。
一个附带的测试
前面的两个函数都是有返回值的,如果说中间有一个没有返回值的函数会怎么样?
很简单,没有返回值,那不就是返回了一个nil吗?
用下面的代码很容易可以获得结果
a = 5
function add()
return 1,0
end
function void_func()
end
local b,c,d,e = add(),void_func(),add(),a
print(b) -- 1
print(c) -- nil
print(d) -- 1
print(e) -- 5
注意到变量c了吗,它对应的返回函数正好是void_func
,它获取到的值是nil。
当然最直接的测试还是这样:
f = void_func();
print(f) -- nil
返回值是nil