Lua函數的多個返回值
來源:程序員人生 發布時間:2016-10-22 13:59:41 閱讀次數:3778次
C++和Java 中return都不允許返回多個值。Lua中的函數的1個很特殊也很有用的性質,便可以有多個返回值。包括1些內置的函數就是這樣。比如string.find函數,在給定的字符串中查找1個pattern,如果有匹配的部份,則返回對應的頭、尾的兩個索引值;如果不存在匹配,則返回nil。固然,用戶定義的函數也能夠有多個返回值,通過return關鍵字返回多個結果便可。比如1個返回數組中最大值及其索引的函數:function max(a)
local m = a[1];
local mIndex = 1;
for i,v in ipairs(a) do
if v>m then
m = v;
mIndex = i;
end
end
return m,mIndex;
end
通常情況下,Lua會根據函數調用的不同情況自動調劑返回值的有效個數。主要有以下幾種情況:
1. 如果函數調用作為1個單獨的語句,比如max({1,2,3}),則疏忽所有的返回值;
2. 如果調用途在1串的表達式中:
1)如果處于表達式串的首位或中間,則只有第1個返回值被返回;
2)如果處于最后1個表達式,則所有的返回值都有效;
拿下面3個函數作為例子:
function f0() end;
function f1() return "a" end
function f2() return "a","b" end
在多重賦值中,如果函數調用作為唯一的或最后1個表達式,則返回盡量多的值來匹配左側的變量,如果多出,自動疏忽;如果不夠,賦為nil。比如,
x = f1() --x="a","b"被疏忽
x,y = f1() --x="a",y="b"
x,y,z = f2() --x="a",y="b",z=nil
x,y,z = 10,f2() -- x=10, y="a", z="b"
x,y,z = f2(),10 -- x="a", y=10, z=nil, f2只返回1個值
同理, 作為另外一個函數的參數時,規則1樣:
print(f2()) --> a b
print(f2(), 1) --> a 1
還有用來構造數組時:
[plain] view plain copy
t = {f2()} -- t = {"a", "b"}
t = {f0(), f2(), 4} -- t[1] = nil, t[2] = "a", t[3] = 4
最后,當函數返回值作為另外一個函數的返回值被返回時,則全部被返回。如果想強迫只返回1個值 ,則可以用括號 "()" 把表達式括起來便可。比如:
function foo (i)
if i == 0 then return foo0()
elseif i == 1 then return foo1()
elseif i == 2 then return foo2()
end
end
[plain] view plain copy
print(foo(1)) --> a
print(foo(2)) --> a b
print(foo(0)) -- (無返回值)
print(foo(3)) -- (無返回值)
如果想強迫只返回1個值,則可以用括號 "()" 把表達式括起來便可:
print((foo0())) --> nil
print((foo1())) --> a
print((foo2())) --> a
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈