關(guān)于迭代器的內(nèi)容,還有一點(diǎn)點(diǎn),不過已經(jīng)無關(guān)緊要了,應(yīng)該算是一種擴(kuò)展吧,就一起來開開眼界好了~
1.避免創(chuàng)建閉合函數(shù)
我們之前一直在說的迭代器,都是要?jiǎng)?chuàng)建閉合函數(shù),但,大家有沒有想過,有了恒定狀態(tài)和控制變量之后,是不是就不需要閉合函數(shù)了?
先來回顧一下之前的迭代器函數(shù):
復(fù)制代碼 代碼如下:
function dieDaiQi(t)
local i = 0;
return function(s, var)
i = i + 1;
if i > #t then
return nil;
end
return i, t[i];
end, 10, 0
end
這是最后一次介紹的dieDaiQi函數(shù),此時(shí)已經(jīng)擁有了恒定狀態(tài)和控制變量了。
不覺得那個(gè)local i變量很礙事嗎?(小若:不覺得)
只要把它去掉,那就不存在閉合函數(shù)了。
我們把dieDaiQi函數(shù)改成這樣子:
復(fù)制代碼 代碼如下:
function dieDaiQi(t)
return function(s, var)
var = var + 1;
if var > #s then
return nil;
end
return var, s[var];
end, t, 0
end
我們把恒定狀態(tài)改為t,控制變量初值仍然是0。
調(diào)用dieDaiQi函數(shù)后,返回一個(gè)新的函數(shù),這個(gè)函數(shù)已經(jīng)不屬于閉合函數(shù)了。
于是,按照上一篇內(nèi)容的介紹(不記得的就回頭看看吧),每次調(diào)用函數(shù)時(shí),參數(shù)s就是我們需要的table,參數(shù)var從0開始,代替了local i變量。
怎么樣?稍微覺得恒定狀態(tài)和控制變量有點(diǎn)用處了吧?
2.利用恒定狀態(tài)創(chuàng)造更多變量
剛剛所說的方法,是挺好的,但是,能夠改變的變量只有一個(gè),如果這迭代器需要很多變量呢?
除了使用閉合函數(shù)之外,還有一個(gè)辦法——將永恒變?yōu)樯谱儭?br />
我們繼續(xù)修改dieDaiQi函數(shù):
復(fù)制代碼 代碼如下:
function dieDaiQi(t)
return function(s, var)
var = var + 1;
if var > #s.list then
return nil;
end
s.money = s.money * s.money;
print("呵呵,錢,對(duì)我來說,就是一個(gè)數(shù)字而已:" .. s.money);
return var, s.list[var];
end, {list = t, money = 10}, 0
end
留意一下,現(xiàn)在返回的恒定狀態(tài)是一個(gè)table({list = t, money = 10})。
這個(gè)table在迭代過程中依舊是恒定不變的,但,它里面的內(nèi)容可就不一定了。
試試調(diào)用這個(gè)迭代器吧:
復(fù)制代碼 代碼如下:
local t = {"fdsd", "445", "9999"};
for k, v in dieDaiQi(t) do
print("k=" .. k .. ", v=" .. v);
end
輸出結(jié)果如下:
復(fù)制代碼 代碼如下:
[LUA-print] 呵呵,錢,對(duì)我來說,就是一個(gè)數(shù)字而已:100
[LUA-print] k=1, v=fdsd
[LUA-print] 呵呵,錢,對(duì)我來說,就是一個(gè)數(shù)字而已:10000
[LUA-print] k=2, v=445
[LUA-print] 呵呵,錢,對(duì)我來說,就是一個(gè)數(shù)字而已:100000000
[LUA-print] k=3, v=9999
怎么樣?雖然每次迭代都是同一個(gè)table,但table的內(nèi)容可是隨時(shí)在變的。
就像某些人吖,嘴上說永遠(yuǎn),行動(dòng)卻隨時(shí)變。(小若:是說你自己?jiǎn)???/p>
3.不需要for循環(huán)的迭代器
現(xiàn)在調(diào)用迭代器都是要用到for循環(huán)的,其實(shí),在很久很久以前…有一個(gè)…(小若:停!我不是來聽故事的)
好吧,其實(shí),在以前,迭代器是不使用for語句的。
我們來模擬一下以前的做法:
復(fù)制代碼 代碼如下:
function dieDaiQiHistory(t, func)
for i = 1, #t, 1 do
func(i, t[i]);
end
end
(小若:我噗,為什么一開始不這么做?這樣多簡(jiǎn)單啊喂?。?br />
咳咳,我們?cè)囋囌{(diào)用這個(gè)迭代器:
復(fù)制代碼 代碼如下:
local t = {"fdsd", "445", "9999"};
dieDaiQiHistory(t, function(k, v)
print("k=" .. k .. ", v=" .. v);
end);
于是,在調(diào)用迭代器的時(shí)候,我們不需要使用for循環(huán)(雖然迭代器里面還是使用了)。
并且需要傳遞一個(gè)函數(shù)作為參數(shù),用于回調(diào),獲得迭代的值。
由于我沒有大量地使用者兩種形式的迭代器,所以也沒法去對(duì)比他們。
書上的作者是傾向于使用“現(xiàn)代”的迭代器。
而且我也發(fā)現(xiàn),部分Lua的庫(kù)函數(shù),也是使用了這種形式的迭代,也許是歷史原因,又也許是這種形式有其特有的使用場(chǎng)合。
4.結(jié)束
好了,關(guān)于迭代器,已經(jīng)結(jié)束了。
感覺還不錯(cuò),這是我第三遍翻這本書的前面章節(jié)了吧?果然還是得寫寫文章,才能理解地更透徹,印象也比較深刻。
越到后面就越難堅(jiān)持了,加油吧…
(小若:所以說?。槭裁醋詈笥钟昧耸÷蕴?hào)?。∮酶袊@號(hào)才顯得比較有干勁啊…)
您可能感興趣的文章:- 深入解讀Lua中迭代器與泛型for的使用
- 淺析Lua中的迭代器
- Lua教程(五):迭代器和泛型for
- Lua中的迭代器和泛型for介紹
- Lua中的迭代器和泛型for學(xué)習(xí)總結(jié)
- Lua中的迭代器和泛型for實(shí)例
- Lua中的迭代器(iterator)淺析
- Lua中的for循環(huán)和迭代器的秘密探究
- Lua中的迭代器淺析
- Lua基礎(chǔ)迭代器的使用實(shí)例