日落20190824001 - Lua之unpack與select實現泛型方法

環境

系統: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節

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章