亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua教程(五):迭代器和泛型for

2024-07-21 23:04:43
字體:
來源:轉載
供稿:網友

1. 迭代器與Closure:

    在Lua中,迭代器通常為函數,每調用一次函數,即返回集合中的“下一個”元素。每個迭代器都需要在每次成功調用之間保持一些狀態,這樣才能知道它所在的位置和下一次遍歷時的位置。從這一點看,Lua中closure機制為此問題提供了語言上的保障,見如下示例:

 

復制代碼 代碼如下:

function values(t)
    local i = 0
    return function()
        i = i + 1
        return t[i]
    end
end
t = {10, 20, 30}
it = values(t)
while true do
    local element = it()
    if element == nil then
        break
    end
    print(element)
end
--另外一種基于foreach的調用方式(泛型for)
t2 = {15, 25, 35}
for element in values(t2) do
    print(element)
end
--輸出結果為:
--10
--20
--30
--15
--25
--35

 

  從上面的應用示例來看,相比于while方式,泛型for的方式提供了更清晰的實現邏輯。因為Lua在其內部替我們保存了迭代器函數,并在每次迭代時調用該隱式的內部迭代器,直到迭代器返回nil時結束循環。

    2. 泛型for的語義:

    上面示例中的迭代器有一個明顯的缺點,即每次循環時都需要創建一個新的closure變量,否則第一次迭代成功后,再將該closure用于新的for循環時將會直接退出。

    這里我們還是先詳細的講解一下Lua中泛型(for)的機制,之后再給出一個無狀態迭代器的例子,以便于我們的理解。如果我們的迭代器實現為無狀態迭代器,那么就不必為每一次的泛型(for)都重新聲明一個新的迭代器變量了。
    泛型(for)的語法如下:
 

復制代碼 代碼如下:

    for <var-list> in <exp-list> do
        <body>
    end
 

    為了便于理解,由于我們在實際應用中<exp-list>通常只是包含一個表達式(expr),因此簡單起見,這里的說明將只是包含一個表達式,而不是表達式列表?,F在我們先給出表達式的原型和實例,如:
復制代碼 代碼如下:

function ipairs2(a)
    return iter,a,0
end

    該函數返回3個值,第一個為實際的迭代器函數變量,第二個是一個恒定對象,這里我們可以理解為待遍歷的容器,第三個變量是在調用iter()函數時為其傳入的初始值。
    下面我們再看一下iter()函數的實現,如:
復制代碼 代碼如下:

local function iter(a, i)
    i = i + 1
    local v = a[i]
    if v then
        return i, v
    else
        return nil, nil
    end
end

在迭代器函數iter()中返回了兩個值,分別對應于table的key和value,其中key(返回的i)如果為nil,泛型(for)將會認為本次迭代已經結束。下面我們先看一下實際用例,如:

 

 

復制代碼 代碼如下:

function ipairs2(a)
    return iter,a,0
end

 


local function iter(a, i)
    i = i + 1
    local v = a[i]
    if v then
        return i, v
    else
        return nil, nil
    end
end

a = {"one","two","three"}
for k,v in ipairs2(a) do
    print(k, v)
end
--輸出結果為:
--1       one
--2       two
--3       three

 

這個例子中的泛型(for)寫法可以展開為下面的基于while循環的方式,如:

 

復制代碼 代碼如下:

local function iter(a, i)
    i = i + 1
    local v = a[i]
    if v then
        return i, v
    else
        return nil, nil
    end
end

 

function ipairs2(a)
    return iter,a,0
end

a = {"one","two","three"}
do
    local _it,_s,_var = ipairs2(a)
    while true do
        local var_1,var_2 = _it(_s,_var)
        _var = var_1
        if _var == nil then  --注意,這里只判斷迭代器函數返回的第一個是否為nil。
            break
        end
        print(var_1,var_2)
    end
end
--輸出結果同上。


    3. 無狀態迭代器的例子:
    這里的示例將實現遍歷鏈表的迭代器。
復制代碼 代碼如下:

local function getnext(list, node)  --迭代器函數。
    if not node then
        return list
    else
        return node.next
    end
end

 

function traverse(list)  --泛型(for)的expression
    return getnext,list,nil
end

--初始化鏈表中的數據。
list = nil
for line in io.lines() do
    line = { val = line, next = list}
end

--以泛型(for)的形式遍歷鏈表。
for node in traverse(list) do
    print(node.val)
end

 

 這里使用的技巧是將鏈表的頭結點作為恒定狀態(traverse返回的第二個值),而將當前節點作為控制變量。第一次調用迭代器函數getnext()時,node為nil,因此函數返回list作為第一個結點。在后續調用中node不再為nil了,所以迭代器返回node.next,直到返回鏈表尾部的nil結點,此時泛型(for)將判斷出迭代器的遍歷已經結束。

    最后需要說明的是,traverse()函數和list變量可以反復的調用而無需再創建新的closure變量了。這主要是因為迭代器函數(getnext)實現為無狀態迭代器。

    4. 具有復雜狀態的迭代器:

    在上面介紹的迭代器實現中,迭代器需要保存許多狀態,可是泛型(for)卻只提供了恒定狀態和控制變量用于狀態的保存。一個最簡單的辦法是使用closure。當然我們還以將所有的信息封裝到一個table中,并作為恒定狀態對象傳遞給迭代器。雖說恒定狀態變量本身是恒定的,即在迭代過程中不會換成其它對象,但是該對象所包含的數據是否變化則完全取決于迭代器的實現。就目前而言,由于table類型的恒定對象已經包含了所有迭代器依賴的信息,那么迭代器就完全可以忽略泛型(for)提供的第二個參數。下面我們就給出一個這樣的實例,見如下代碼:
 

復制代碼 代碼如下:

 local iterator
function allwords()
    local state { line = io.read(), pos = 1 }
    return iterator, state
end
--iterator函數將是真正的迭代器
function iterator(state)
    while state.line do
        local s,e = string.find(state.line,"%w+",state.pos)
        if s then
            state.pos = e + 1
            return string.sub(state.line,s,e)
        else
            state.line = io.read()
            state.pos = 1
        end
    end
    return nil
end
 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
综合136福利视频在线| 国产精品精品久久久久久| 国模极品一区二区三区| 福利视频第一区| 国产一区二区三区在线播放免费观看| 欧美日韩国产麻豆| 中文字幕成人精品久久不卡| 日韩国产一区三区| 亚洲最大av网| 亚洲第一精品自拍| 在线播放国产一区中文字幕剧情欧美| 国产精品www色诱视频| 国模私拍一区二区三区| 久久精品2019中文字幕| 国产成+人+综合+亚洲欧洲| 久久视频在线直播| 精品久久香蕉国产线看观看亚洲| 亚洲午夜未满十八勿入免费观看全集| 日韩欧美高清在线视频| 亚洲成人久久一区| 日韩av高清不卡| 国产+成+人+亚洲欧洲| 日韩小视频网址| 97国产suv精品一区二区62| 国产精品久久久久久久久粉嫩av| 国内精品美女av在线播放| 亚洲欧美综合另类中字| 精品一区二区三区四区在线| 亚洲国产黄色片| 国产视频精品一区二区三区| 国产精品欧美日韩| 欧美黄色性视频| 久久精品国产96久久久香蕉| 欧美日本高清一区| 日韩精品亚洲视频| 久久久久久国产免费| 狠狠爱在线视频一区| 久久久精品久久久| 精品久久久久久中文字幕大豆网| 国产精品∨欧美精品v日韩精品| 免费不卡在线观看av| 久久久久久91香蕉国产| 欧美激情精品久久久久久大尺度| 亚洲精品wwwww| 欧美在线视频一区二区| 国产美女91呻吟求| 亚洲一级免费视频| 在线电影欧美日韩一区二区私密| 91久久久久久久久久久| 国外视频精品毛片| 日韩av电影在线网| 国产精品成人国产乱一区| 欧美激情视频一区二区三区不卡| 97视频在线观看网址| 成人免费视频xnxx.com| 亚洲免费影视第一页| 国产日韩在线播放| 国产日韩中文字幕在线| 国产精品av网站| 亚洲黄在线观看| 精品久久久久久久久久国产| 97超视频免费观看| 国产一区二区三区中文| 国产精品免费看久久久香蕉| 中文字幕日韩欧美| 亚洲成人网在线| 精品magnet| 日韩av在线影视| 亚洲国产天堂久久综合| 国产精品白嫩初高中害羞小美女| 欧美在线视频观看免费网站| 国产精品国产三级国产aⅴ浪潮| 91精品国产综合久久香蕉最新版| 俺去了亚洲欧美日韩| 色无极影院亚洲| 亚洲女人天堂视频| 国产精品都在这里| 亚洲人免费视频| 亚洲天堂免费在线| 亚洲国产精久久久久久| 91色精品视频在线| 日韩高清av一区二区三区| 热99精品里视频精品| 国产欧美 在线欧美| 欧美日韩国产页| 日韩欧美在线免费| 日韩一区av在线| 欧美激情xxxx| 久久久久久久久久久av| 国产精品永久免费在线| 91精品国产高清自在线| 最近2019中文免费高清视频观看www99| 亚洲一区二区日本| 精品国产自在精品国产浪潮| 狠狠做深爱婷婷久久综合一区| 亚洲自拍偷拍在线| 亚洲一区二区久久久| 成人免费福利视频| 欧美日韩国产在线| 91情侣偷在线精品国产| 国产精品视频白浆免费视频| 亚洲欧洲日韩国产| 91久久精品久久国产性色也91| 国产视频亚洲精品| 曰本色欧美视频在线| 色综合导航网站| 日韩在线视频线视频免费网站| 日韩精品高清在线| 日韩亚洲第一页| 久久久久久久91| 欧美一级电影在线| 97精品国产97久久久久久春色| 亚洲成人黄色网址| 国产成+人+综合+亚洲欧美丁香花| 国产精品久久久久久五月尺| 欧美大人香蕉在线| 2019中文字幕在线免费观看| 亚洲午夜精品久久久久久性色| 91影视免费在线观看| 91av视频在线观看| 欧美午夜片在线免费观看| www.久久久久| 成人免费xxxxx在线观看| 国产日韩欧美综合| 456亚洲影院| 一区二区三区回区在观看免费视频| 亚洲精品久久视频| 都市激情亚洲色图| 日韩中文字幕国产| 91av在线播放| www日韩中文字幕在线看| 日韩美女写真福利在线观看| 国产日韩综合一区二区性色av| 亚洲人精选亚洲人成在线| 日韩电影中文字幕av| 国产精品久久91| 亚洲xxxx18| 久久精品视频在线播放| 欧美日韩亚洲高清| 欧美中文字幕视频在线观看| 日韩欧美高清在线视频| 亚洲国产美女久久久久| 亚洲激情在线观看视频免费| 久久精品亚洲94久久精品| 成人www视频在线观看| 亚洲老头老太hd| 黄色成人在线免费| 日韩精品极品毛片系列视频| 奇米四色中文综合久久| 亚洲自拍偷拍视频| 日韩中文第一页| 亚洲女人被黑人巨大进入al| 亚洲男人第一av网站| 亚洲美女动态图120秒| 久久久久一本一区二区青青蜜月| 亚洲国产精品专区久久| 久久精品国产清自在天天线| 国产精品日本精品| 一本色道久久综合狠狠躁篇怎么玩| 欧美一级片在线播放| 国产成人综合精品在线| 欧美国产一区二区三区| 性色av香蕉一区二区| 欧美日韩一区免费|