關于迭代器的內容,還有一點點,不過已經無關緊要了,應該算是一種擴展吧,就一起來開開眼界好了~
1.避免創建閉合函數
我們之前一直在說的迭代器,都是要創建閉合函數,但,大家有沒有想過,有了恒定狀態和控制變量之后,是不是就不需要閉合函數了?
先來回顧一下之前的迭代器函數:
這是最后一次介紹的dieDaiQi函數,此時已經擁有了恒定狀態和控制變量了。
不覺得那個local i變量很礙事嗎?(小若:不覺得)
只要把它去掉,那就不存在閉合函數了。
我們把dieDaiQi函數改成這樣子:
我們把恒定狀態改為t,控制變量初值仍然是0。
調用dieDaiQi函數后,返回一個新的函數,這個函數已經不屬于閉合函數了。
于是,按照上一篇內容的介紹(不記得的就回頭看看吧),每次調用函數時,參數s就是我們需要的table,參數var從0開始,代替了local i變量。
怎么樣?稍微覺得恒定狀態和控制變量有點用處了吧?
2.利用恒定狀態創造更多變量
剛剛所說的方法,是挺好的,但是,能夠改變的變量只有一個,如果這迭代器需要很多變量呢?
除了使用閉合函數之外,還有一個辦法——將永恒變為善變。
我們繼續修改dieDaiQi函數:
留意一下,現在返回的恒定狀態是一個table({list = t, money = 10})。
這個table在迭代過程中依舊是恒定不變的,但,它里面的內容可就不一定了。
試試調用這個迭代器吧:
輸出結果如下:
3.不需要for循環的迭代器
現在調用迭代器都是要用到for循環的,其實,在很久很久以前…有一個…(小若:停!我不是來聽故事的)
好吧,其實,在以前,迭代器是不使用for語句的。
我們來模擬一下以前的做法:
(小若:我噗,為什么一開始不這么做?這樣多簡單啊喂!)
咳咳,我們試試調用這個迭代器:
于是,在調用迭代器的時候,我們不需要使用for循環(雖然迭代器里面還是使用了)。
并且需要傳遞一個函數作為參數,用于回調,獲得迭代的值。
由于我沒有大量地使用者兩種形式的迭代器,所以也沒法去對比他們。
書上的作者是傾向于使用“現代”的迭代器。
而且我也發現,部分Lua的庫函數,也是使用了這種形式的迭代,也許是歷史原因,又也許是這種形式有其特有的使用場合。
4.結束
好了,關于迭代器,已經結束了。
感覺還不錯,這是我第三遍翻這本書的前面章節了吧?果然還是得寫寫文章,才能理解地更透徹,印象也比較深刻。
越到后面就越難堅持了,加油吧…
(小若:所以說??!為什么最后又用了省略號??!用感嘆號才顯得比較有干勁啊…)
新聞熱點
疑難解答