函数返回值在上下文中的表现
lua中函数的返回值可以有多个
假如这个函数有三个返回值,在所有语境下他的返回值都是3个吗???
来做个实验
例子
我们来看下面这段代码
function test(a, b, c, d)
print(a, b, c, d)
end
function f()
return 1, 2, 3
end
test(f(), 1)
>>>
1 1 nil nil
>>>
-
f()函数有三个返回值,打印数据可以看到,只输出了f()的一个返回值,以及另一个参数,其余值都是nil。
-
那如果f()作为第二个参数呢?
function test(a, b, c, d)
print(a, b, c, d)
end
function f()
return 1, 2, 3
end
test(1, f())
>>>
1 1 2 3
>>>
看到输出结果将f()展开成3个值
- 如果f()后面还有一个参数呢?
function test(a, b, c, d)
print(a, b, c, d)
end
function f()
return 1, 2, 3
end
test(1, f(), 3)
>>>
1 1 3 nil
>>>
可以看到,还是将函数作为一个数展开
- 不论是进行上述操作或者将该函数放到等号右边做赋值使用 都是一样的结果 这是为什么呢?
- 进行总结之前先看下面的例子
不同情况下的表现
- 将这个函数作为返回值 return回去会怎么样?
function test3(a, b, c)
print(a, b, c)
end
function test2(params)
print(params)
end
function test1(a, b, c, d)
return f()
end
function f()
return 1, 2, 3
end
test2(test1())
test2(f())
test3(f())
test3(test1())
>>>
1
1
1 2 3
1 2 3
>>>
- 通过这个对比实验也可以看出来,函数作为返回值,是会把所有的内容(3个)都返回到内存中,
- 同理 如果是 return . . . 这种未知个数的参数形式 返回时也是有多少参数返回多少参数
function test3(a, b, c, d)
print(a, b, c, d)
end
function test2(params)
print(params)
end
function test1(a, b, c, d)
return f(), 4
end
function f()
return 1, 2, 3
end
test2(test1())
test2(f())
test3(f())
test3(test1())
-
再来看这个例子,作为返回值的f()后面跟了一个参数 导致f()被压缩成只有一个元素
-
最后函数作为表元素时 看如下例子
function f()
return 1, 2, 3
end
local temp = {f()}
local temp1 = {f(), nil}
for k, v in pairs(temp) do
print(k, v)
end
print("")
for k, v in pairs(temp1) do
print(k, v)
end
>>>>
1 1
2 2
3 3
1 1
>>>>
– 当看到这个例子的时候就一目了然了
总结:当函数作为赋值表达式右侧时 只要他后面没有跟元素 长度就是本身的长度 后面有其他元素 长度就是一个元素长度
参考
- 上述的问题都是reference中记录的 有问题可以参考此处
- 若函数在小括号内部,则其返回值只有一个值
function f()
return 1, 2, 3
end
print(f())
print((f()))
>>>>
1 2 3
1
>>>>
- 实验里也可以看出来 没有打括号的函数返回了三个值
- 在括号里面的函数只能返回一个值
PS: markdown可以画流程图