LUA 函数与多重赋值
函数声明与调用
函数声明格式
function name ()
something
return
end
等价
name = function ()
something
return
end
函数调用需要在函数名后加括号(),但有一种例外:当函数只有一个参数且参数是字符串或者表时可以不用加括号
print "Hello" 等价 print ("Hello")
多重赋值规则
当变量列表多于值列表时:a, b, c = 1, 2
会以nil补充值列表
当变量列表少于值列表时:a, b = 1, 2, 3
会丢弃多余的值列表
多重赋值嵌套
当拥有多值的对象是多重赋值中唯一或最后一个参数时
假设f()返回两个值1,2
a, b, c = f() --> a, b, c = 1, 2, nil
a, b, c = 1, f() --> a, b, c = 1, 1, 2
函数会展开所有返回值与变量列表按顺序进行多重赋值
当拥有多值的对象不是多重赋值中唯一或最后一个参数时
a, b, c = f(), 2, 3 --> a, b, c = 1, 2, 3
a, b, c = 1, f(), 3 --> a, b, c = 1, 1, 3
函数只会取第一个返回值与变量列表按顺序进行多重赋值
如果给拥有多值的对象加上括号()就可以强制其只使用第一个返回值进行操作
a, b, c = (f()) --> 1, nil, nil
利用多重赋值交换变量
a, b = b, a
多重赋值机制适用的其他场景
函数嵌套:print ( f ()) print函数会接收两个f函数的返回值作为参数,同样也适用多重赋值机制,如:print (1, f()) / print ((f()) / print (f(), 1)
表嵌套:t = {f()} f函数会在表中展开多返回值,同样也适用多重赋值机制,如:t = {1,f()} / t = {(f())} / t = {f(), 1}
函数可变参
可变参表达式 ... 三个点,他可以表示所有传入的实参列表。该表达式一样可以参与多重赋值,表初始化,函数调用,同样适用多重赋值机制。
function a (...)
return ...
end
该函数将返回所有传入的参数
遍历可变参:select (index, ...)
返回指定位置的参数
参数index:指定位置,当参数为"#"时,返回参数列表的个数。参数...:参数列表
select (1, "a", "b", "c") --> a b c
select (2, "a", "b", "c") --> b c
select ("#", "a", "b", "c") --> 3
function add (...) -- 数组可变参求和 local s=0 for i=1, select ("#", ...) do -- 根据可变参数量循环 s=s+select (i, ...) -- 逐一将每个参数相加 end return s -- 返回求和总数 end