Lua 具有一項(xiàng)與眾不同的特性,允許函數(shù)返回多個(gè)值。Lua 的庫函數(shù)中,有一些就是返回多個(gè)值。
示例代碼:使用庫函數(shù)
string.find
,在源字符串中查找目標(biāo)字符串,若查找成功,則返回目標(biāo)字符串在源字符串中的起始位置和結(jié)束位置的下標(biāo)。
local s, e = string.find("hello world", "llo")
print(s, e) -->output 3 5
返回多個(gè)值時(shí),值之間用“,”隔開。
示例代碼:定義一個(gè)函數(shù),實(shí)現(xiàn)兩個(gè)變量交換值
local function swap(a, b) -- 定義函數(shù) swap,實(shí)現(xiàn)兩個(gè)變量交換值
return b, a -- 按相反順序返回變量的值
end
local x = 1
local y = 20
x, y = swap(x, y) -- 調(diào)用 swap 函數(shù)
print(x, y) --> output 20 1
當(dāng)函數(shù)返回值的個(gè)數(shù)和接收返回值的變量的個(gè)數(shù)不一致時(shí),Lua 也會(huì)自動(dòng)調(diào)整參數(shù)個(gè)數(shù)。
調(diào)整規(guī)則: 若返回值個(gè)數(shù)大于接收變量的個(gè)數(shù),多余的返回值會(huì)被忽略掉; 若返回值個(gè)數(shù)小于參數(shù)個(gè)數(shù),從左向右,沒有被返回值初始化的變量會(huì)被初始化為 nil。
示例代碼:
function init() --init 函數(shù) 返回兩個(gè)值 1 和 "lua"
return 1, "lua"
end
x = init()
print(x)
x, y, z = init()
print(x, y, z)
--output
1
1 lua nil
當(dāng)一個(gè)函數(shù)有一個(gè)以上返回值,且函數(shù)調(diào)用不是一個(gè)列表表達(dá)式的最后一個(gè)元素,那么函數(shù)調(diào)用只會(huì)產(chǎn)生一個(gè)返回值, 也就是第一個(gè)返回值。
示例代碼:
local function init() -- init 函數(shù) 返回兩個(gè)值 1 和 "lua"
return 1, "lua"
end
local x, y, z = init(), 2 -- init 函數(shù)的位置不在最后,此時(shí)只返回 1
print(x, y, z) -->output 1 2 nil
local a, b, c = 2, init() -- init 函數(shù)的位置在最后,此時(shí)返回 1 和 "lua"
print(a, b, c) -->output 2 1 lua
函數(shù)調(diào)用的實(shí)參列表也是一個(gè)列表表達(dá)式??紤]下面的例子:
local function init()
return 1, "lua"
end
print(init(), 2) -->output 1 2
print(2, init()) -->output 2 1 lua
如果你確保只取函數(shù)返回值的第一個(gè)值,可以使用括號(hào)運(yùn)算符,例如
local function init()
return 1, "lua"
end
print((init()), 2) -->output 1 2
print(2, (init())) -->output 2 1
值得一提的是,如果實(shí)參列表中某個(gè)函數(shù)會(huì)返回多個(gè)值,同時(shí)調(diào)用者又沒有顯式地使用括號(hào)運(yùn)算符來篩選和過濾,則這樣的表達(dá)式是不能被 LuaJIT 2 所 JIT 編譯的,而只能被解釋執(zhí)行。