環境
系統:Windows 10
引擎:Lua5.3.5
目的
通過實例使用unpack與select函數,瞭解lua的多重返回值和變長參數,以實現泛型方法。
實例
(1)使用unpack函數可以返回多個值。
function aaa()
local a = {"hello kitty","tt"}
print(string.find(unpack(a)))
end
aaa()
(2)但在lua5.3.5版本,用上面的代碼,就會報錯:
… attempt to call a nil value (global ‘unpack’)
(3)因爲lua5.3.5的公共函數庫裏沒有unpack,所以需要手動來一個。
function unpack(t, i)
i = i or 1
if t[i] then
return t[i], unpack(t, i + 1)
end
end
function aaa()
local a = {"hello kitty","tt"}
print(string.find(unpack(a)))
end
aaa()
(4)加入select的運用,可以通過變長參數的機制,實現泛型方法。
function unpack(t, i)
i = i or 1
if t[i] then
return t[i], unpack(t, i + 1)
end
end
function aaa(...)
local f = select(1, ...) -- 即select(1, ...)第一個參數:string.find
local a
for i = 2, select('#', ...) do -- select('#', ...)即變長參數的數量
a = select(i, ...) -- 從變長參數第i個開始
end
print(f(unpack(a)))
end
aaa(string.find, {"hello kitty","tt"})
(5)稍微改變一下,把入參從table類型切分開,個人覺得比較好看。
function unpack(t, i)
i = i or 1
if t[i] then
return t[i], unpack(t, i + 1)
end
end
function aaa(...)
local f = select(1, ...) -- 即select(1, ...)第一個參數:string.find
local a = {}
for i = 2, select('#', ...) do -- select('#', ...)即變長參數的數量
a[#a+1] = select(i, ...) -- 從變長參數第i個開始
end
print(f(unpack(a)))
end
aaa(string.find, "hello kitty", "tt")
以上結果均爲:
9 10
[Finished in 0.1s]
以上簡單回顧。
參考資料:
《Lua程序設計(第二版)》第5.1節與第5.2節