欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Lua的迭代器使用中應(yīng)該避免的問題和技巧

 更新時間:2014年09月13日 10:39:17   作者:笨木頭  
這篇文章主要介紹了Lua的迭代器使用中應(yīng)該避免的問題和技巧,本文介紹了避免創(chuàng)建閉合函數(shù)、利用恒定狀態(tài)創(chuàng)造更多變量、不需要for循環(huán)的迭代器等內(nèi)容,需要的朋友可以參考下

關(guān)于迭代器的內(nèi)容,還有一點點,不過已經(jīng)無關(guān)緊要了,應(yīng)該算是一種擴展吧,就一起來開開眼界好了~

1.避免創(chuàng)建閉合函數(shù)

我們之前一直在說的迭代器,都是要創(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ù),此時已經(jīng)擁有了恒定狀態(tài)和控制變量了。
不覺得那個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ù)后,返回一個新的函數(shù),這個函數(shù)已經(jīng)不屬于閉合函數(shù)了。
于是,按照上一篇內(nèi)容的介紹(不記得的就回頭看看吧),每次調(diào)用函數(shù)時,參數(shù)s就是我們需要的table,參數(shù)var從0開始,代替了local i變量。
 
怎么樣?稍微覺得恒定狀態(tài)和控制變量有點用處了吧?

2.利用恒定狀態(tài)創(chuàng)造更多變量

剛剛所說的方法,是挺好的,但是,能夠改變的變量只有一個,如果這迭代器需要很多變量呢?

除了使用閉合函數(shù)之外,還有一個辦法——將永恒變?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("呵呵,錢,對我來說,就是一個數(shù)字而已:" .. s.money);
        return var, s.list[var];
    end, {list = t, money = 10}, 0
end

留意一下,現(xiàn)在返回的恒定狀態(tài)是一個table({list = t, money = 10})。
這個table在迭代過程中依舊是恒定不變的,但,它里面的內(nèi)容可就不一定了。
試試調(diào)用這個迭代器吧:

復(fù)制代碼 代碼如下:

    local t = {"fdsd", "445", "9999"};
  
    for k, v in dieDaiQi(t) do
        print("k=" .. k .. ", v=" .. v);
    end

輸出結(jié)果如下:

復(fù)制代碼 代碼如下:

[LUA-print] 呵呵,錢,對我來說,就是一個數(shù)字而已:100
[LUA-print] k=1, v=fdsd
[LUA-print] 呵呵,錢,對我來說,就是一個數(shù)字而已:10000
[LUA-print] k=2, v=445
[LUA-print] 呵呵,錢,對我來說,就是一個數(shù)字而已:100000000
[LUA-print] k=3, v=9999

怎么樣?雖然每次迭代都是同一個table,但table的內(nèi)容可是隨時在變的。
就像某些人吖,嘴上說永遠,行動卻隨時變。(小若:是說你自己嗎?)

3.不需要for循環(huán)的迭代器

現(xiàn)在調(diào)用迭代器都是要用到for循環(huán)的,其實,在很久很久以前…有一個…(小若:停!我不是來聽故事的)

好吧,其實,在以前,迭代器是不使用for語句的。
 
我們來模擬一下以前的做法:

復(fù)制代碼 代碼如下:

function dieDaiQiHistory(t, func)
    for i = 1, #t, 1 do
        func(i, t[i]);
    end
end

(小若:我噗,為什么一開始不這么做?這樣多簡單啊喂?。?br /> 咳咳,我們試試調(diào)用這個迭代器:

復(fù)制代碼 代碼如下:

    local t = {"fdsd", "445", "9999"};
    dieDaiQiHistory(t, function(k, v)
        print("k=" .. k .. ", v=" .. v);
    end);

于是,在調(diào)用迭代器的時候,我們不需要使用for循環(huán)(雖然迭代器里面還是使用了)。
并且需要傳遞一個函數(shù)作為參數(shù),用于回調(diào),獲得迭代的值。
 
由于我沒有大量地使用者兩種形式的迭代器,所以也沒法去對比他們。
書上的作者是傾向于使用“現(xiàn)代”的迭代器。
 
而且我也發(fā)現(xiàn),部分Lua的庫函數(shù),也是使用了這種形式的迭代,也許是歷史原因,又也許是這種形式有其特有的使用場合。

4.結(jié)束

好了,關(guān)于迭代器,已經(jīng)結(jié)束了。

感覺還不錯,這是我第三遍翻這本書的前面章節(jié)了吧?果然還是得寫寫文章,才能理解地更透徹,印象也比較深刻。

越到后面就越難堅持了,加油吧…
(小若:所以說??!為什么最后又用了省略號??!用感嘆號才顯得比較有干勁啊…)

相關(guān)文章

  • Lua中設(shè)置table為只讀屬性的方法詳解

    Lua中設(shè)置table為只讀屬性的方法詳解

    這篇文章主要給大家介紹了關(guān)于Lua中設(shè)置table為只讀屬性的方法,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Lua中實現(xiàn)sleep函數(shù)功能的4種方法

    Lua中實現(xiàn)sleep函數(shù)功能的4種方法

    這篇文章主要介紹了Lua中實現(xiàn)sleep函數(shù)功能的4種方法,本文講解了在一個死循環(huán)中設(shè)置一個跳出條件方法、調(diào)用系統(tǒng)的sleep函數(shù)法、Windows下ping命令法、socket庫中select函數(shù)法4種方法,需要的朋友可以參考下
    2015-04-04
  • Lua table簡明總結(jié)

    Lua table簡明總結(jié)

    這篇文章主要介紹了Lua table簡明總結(jié),table是lua唯一的數(shù)據(jù)結(jié)構(gòu),table 是 lua 中最重要的數(shù)據(jù)類型,本文詳細講解了table的相關(guān)知識,需要的朋友可以參考下
    2014-10-10
  • lua腳本語言快速入門教程

    lua腳本語言快速入門教程

    這篇文章主要介紹了lua腳本語言快速入門教程,本文講解了變量及常量、字符串、邏輯控制語句、循環(huán)結(jié)構(gòu)、函數(shù)及其使用等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • 在Mac OS中安裝Lua的教程

    在Mac OS中安裝Lua的教程

    這篇文章主要介紹了在Mac OS中安裝Lua的教程,盡管基于Unix的Mac OS并沒有集成Lua解釋器,但安裝起來依然super easy:)需要的朋友可以參考下
    2015-07-07
  • Lua中的__index和__newindex實例

    Lua中的__index和__newindex實例

    這篇文章主要介紹了Lua中的__index和__newindex實例,本文講解了具有默認(rèn)值的table、記錄table的訪問、只讀的table等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • 使用lua實現(xiàn)php的var_dump()函數(shù)功能

    使用lua實現(xiàn)php的var_dump()函數(shù)功能

    小編比較熟悉php,所以這篇文章主要介紹了使用lua實現(xiàn)php的var_dump()函數(shù)功能,需要的朋友可以參考下
    2014-11-11
  • Lua中的常用函數(shù)庫匯總

    Lua中的常用函數(shù)庫匯總

    這篇文章主要介紹了Lua中的常用函數(shù)庫匯總,本文羅列了lua庫函數(shù)、數(shù)學(xué)函數(shù)、字符串庫、表函數(shù)、Bit Functions,需要的朋友可以參考下
    2014-09-09
  • Lua中獲取utf8字符串長度的方法和自定義函數(shù)

    Lua中獲取utf8字符串長度的方法和自定義函數(shù)

    這篇文章主要介紹了Lua中獲取utf8字符串長度的方法和自定義函數(shù),本文給出了代碼實例并講解了UTF8的編碼規(guī)則,需要的朋友可以參考下
    2015-04-04
  • 舉例簡介Lua中函數(shù)的基本用法

    舉例簡介Lua中函數(shù)的基本用法

    這篇文章主要介紹了舉例簡介Lua中函數(shù)的基本用法,--兩個橫線開始單行的注釋,--[[加上兩個[和]表示多行的注釋--]],需要的朋友可以參考下
    2015-07-07

最新評論