lua 函数的上下文对函数的影响

函数返回值在上下文中的表现


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可以画流程图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值