Java、C#之类的都不允许返回多个值,而Python、Go等允许返回多个值,这极大的方便了自定义函数时,扩展更多的功能。比如一个函数,除了返回结果外,还可以返回错误信息等。Lua也具备这点能力。
function getName()
return "ray", "hu"
end
husband,wife = getName()
print(husband, wife)
-->> ray hu
这种方式在很多场景下都很有效,可以完成其他语言需要借助对象才能完成的工作。比如从考试成绩中查找到最高分和最低分
function getHighAndMin(val)
if val then
high, min = val[1], val[1]
end
for i, v in pairs(val) do
if high < v then
high = v
end
if min > v then
min = v
end
end
return high, min
end
high, min = getHighAndMin({ 37, 59, 98, 87, 29, 99, 67 })
print(high, min)
-->> 99 29
通函数定义时,Lua有实参和形参之分,可以传递超过形参个数的实参,可以正好,也可以少于或者不传,针对不同情况,Lua会执行给形参赋值。对于多个返回值,Lua也有相应的读取返回值的规则。
- 直接调用函数时,没有接收的参数,此时所有返回值都将丢失
function getName()
return "ray", "hu"
end
getName()
-->>
- 函数没有返回值,或返回值不足时,Lua会使用
nil
进行补足,当表达式变量与函数返回相同时,完全接收
function getName()
return "ray", "hu"
end
function change()
name = "ray"
end
a, b = getName()
print(a, b)
-->> ray hu
a, b, c = getName()
print(a, b, c)
-->> ray hu nil
a, b = change()
print(a, b)
-->> nil nil
- 当函数调用是一个表达式的最后一个,或只有该函数调用,将尽可能保留最多的返回值
function getName()
return "ray", "hu"
end
a = getName()
print(a)
-->> ray
a, b, c = "xx", getName()
print(a, b, c)
-->> xx ray hu
- 当函数调用,不是一个表达式的最后元素时,将只返回一个返回值,其他丢弃
function get()
return 1, 2
end
a, b, c = get(), 6
print(a, b, c)
-->> 1 6 nil
a, b = get(), 6, 7
print(a, b)
-->> 1 6
- 当在一个函数中调用另外一个函数时
a(b())
,当b
为a
的最后一个参数时,将b
的所有返回值全部传入到函数a
中
function b()
return 1, 2, 3
end
function a(a, b)
return a + b
end
print(a(b())) -- 3被舍弃
-->> 3
print(a(6, b())) -- 传入1,2,3但2,3被舍弃
-->> 7
- 当声明
table
时,调用函数,同表达式调用类似,如果函数是最后一个元素,则返回全部值,如果不是最后一个,则只返回一个值
function b()
return 1, 2, 3
end
t = {4, b()} -- 4,1,2,3
print(#t)
-->> 4
t = {b(), 4} -- 1,4
print(#t)
-->> 2
- 当使用
return
语句后调用函数时,将返回函数的所有值;如果使用()
标记函数时,则只返回第一个值
function a()
return 1,2,3
end
function b()
return a()
end
print(b())
-->> 1 2 3
print((a()))
-->> 1
网友评论