一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類(lèi)導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Lua - Lua中的迭代器和泛型for實(shí)例

Lua中的迭代器和泛型for實(shí)例

2020-04-12 13:49Mr.Ant Lua

這篇文章主要介紹了Lua中的迭代器和泛型for實(shí)例,本文還講解了無(wú)狀態(tài)迭代器,需要的朋友可以參考下

1、迭代器與closure

在lua中,迭代器通常為函數(shù),每調(diào)用一次函數(shù),會(huì)返回集合中的下一個(gè)元素。每個(gè)迭代器在成功調(diào)用的時(shí)候,都需要保存一些狀態(tài),closure(閉包)完美為迭代器運(yùn)用而生。

 

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


function values(t)
    local i=0
    return function() --匿名函數(shù)
    i=i+1
    return t[i]
    end
end

 

t1 ={10, 20, 30}
it=values(t1)   --創(chuàng)建閉包變量的參數(shù)為函數(shù)參數(shù)
while true do
    local element=it()      --調(diào)用閉包時(shí)的參數(shù)為匿名函數(shù)的參數(shù)
    if(element==nil) then break
    end
    print(element)
end

t2={11,22,33}
for v in values(t2) do
   print(v)
end
--輸出結(jié)果
--10
--20
--30
--11
--22
--33

 

從上面的例子可以看出,范型for相對(duì)于while給我們提供了更為清晰的實(shí)現(xiàn)邏輯。luo的內(nèi)部函數(shù)已經(jīng)為我們提供了迭代函數(shù),運(yùn)行foreach時(shí)我們會(huì)調(diào)用隱式的迭代器。

2、泛型for的語(yǔ)義

上面的迭代器有一個(gè)明顯的缺點(diǎn),就是每次循環(huán)時(shí)都要?jiǎng)?chuàng)建一個(gè)新的closure變量,而不能運(yùn)用之前已經(jīng)創(chuàng)建好了的closure變量,如果我在這個(gè)循環(huán)外再加一個(gè)循環(huán)進(jìn)行迭代時(shí),這就成了一個(gè)很繁瑣并且容易出錯(cuò)的問(wèn)題。

下面出現(xiàn)的迭代器很好的解決了這個(gè)問(wèn)題,就不必為每次的泛型for都創(chuàng)建一個(gè)新的closure變量了。

 

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


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

 

function ipairs(a)
   return iter,a,0         --iter在這里只是一個(gè)函數(shù)變量,并不是調(diào)用函數(shù)
end

a={"one","two","three"}
for i,v in ipairs(a) do
   print(i,v)
end

--上面的泛型for的寫(xiě)法可以改為下面的while寫(xiě)法
do
    local _it,_s,_k=ipairs(a)
    while true do
       k,v=_it(_s,_k)
       _k=k
       if k==nil then break end
       print(k,v)
    end
end
--輸出結(jié)果
--1 one
--2 two
--3 three
--1 one
--2 two
--3 three

 

3、無(wú)狀態(tài)迭代器

 

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


function getnext(list,node)
  if not node then return list
  else return   node.next
  end
end

 

function traverse(list)
  return getnext,list,nil
end

list=nil
for line in io.lines() do
   list={next=list, value=line}
end

for node in traverse(list) do
    print(node.value)
end
--輸入
--a
--b
--c
--輸出
--c
--b
--a

 

通過(guò)上面的例子可以看出,可以無(wú)限次運(yùn)用list變量和調(diào)用traverse函數(shù)而不必像第一種情況那樣每次循環(huán)之前都創(chuàng)建新的closure變量。

延伸 · 閱讀

精彩推薦
  • Lua深入探究Lua中的解析表達(dá)式

    深入探究Lua中的解析表達(dá)式

    這篇文章主要介紹了深入探究Lua中的解析表達(dá)式,對(duì)于其語(yǔ)法部分的說(shuō)明和示例都超詳細(xì),極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
  • LuaLua中計(jì)算、執(zhí)行字符串中Lua代碼的方法

    Lua中計(jì)算、執(zhí)行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計(jì)算、執(zhí)行字符串中Lua代碼的方法,類(lèi)似JavaScript中eval函數(shù)的功能,在Lua中也可以實(shí)現(xiàn),需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • LuaLua教程(二):基礎(chǔ)知識(shí)、類(lèi)型與值介紹

    Lua教程(二):基礎(chǔ)知識(shí)、類(lèi)型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎(chǔ)知識(shí)、類(lèi)型與值介紹,本文講解了Hello World程序、代碼規(guī)范、全局變量、類(lèi)型與值等內(nèi)容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
  • LuaLua實(shí)現(xiàn)__add方法重載示例

    Lua實(shí)現(xiàn)__add方法重載示例

    這篇文章主要介紹了Lua實(shí)現(xiàn)__add方法重載示例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • LuaLua中table庫(kù)函數(shù)方法介紹

    Lua中table庫(kù)函數(shù)方法介紹

    這篇文章主要介紹了Lua中table庫(kù)函數(shù)方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監(jiān)控賦值、通過(guò)table給另一個(gè)table賦值等內(nèi)容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹

    Lua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹

    這篇文章主要介紹了Lua簡(jiǎn)介、編譯安裝教程及變量等語(yǔ)法介紹,本文同時(shí)講解了lua注釋語(yǔ)法、Lua命令行方式等內(nèi)容,需要的朋友可以參考下 ...

    junjie3632020-04-14
  • LuaLua和C語(yǔ)言的交互詳解

    Lua和C語(yǔ)言的交互詳解

    這篇文章主要介紹了Lua和C語(yǔ)言的交互詳解,Lua和C語(yǔ)言通過(guò)棧完成交互,本文結(jié)合代碼實(shí)例詳細(xì)講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
主站蜘蛛池模板: 国产一级视频在线观看 | 激情文学综合网 | 日本大片网 | 四虎影在线永久免费观看 | gogort99人体专业网站 | h在线动漫 | 大叔在线观看 | 99久久精品自在自看国产 | 国产最新精品视频 | 亚洲成熟人网站 | 91精品婷婷国产综合久久8 | 久久综合老色鬼网站 | bt天堂在线最新版在线 | 国产日韩欧美色视频色在线观看 | 欧美艳星kagneyiynn高清 | 亚洲午夜久久久久久91 | 五月天黄网 | 亚洲gogo人体大胆西西安徽 | 和直男装修工在工地啪 | 亚洲第一免费播放区 | 国产精品视频第一区二区 | 亚州第一页 | 黄瓜视频导航 | 国精品午夜dy8888狼人 | 爽好舒服快想要免费看 | 亚洲娇小性hd| 男同互操 | 九色PORNY蝌蚪视频首页 | 成人免费体验区福利云点播 | 皇上撞着太子妃的秘密小说 | 草莓香蕉绿巨人丝瓜榴莲18 | 午夜免费啪视频观看视频 | 奇米影视888四色首页 | 国产美女做爰免费视频网址 | 2022超帅男同gayxxx | 成人精品一级毛片 | 九九大香尹人视频免费 | 四虎最新网址在线观看 | 久久久无码精品亚洲欧美 | 亚洲色图第四色 | 国产成人综合久久 |