Lua中多变量赋值使用多返回函数时,函数返回值的展开规则


我们知道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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值