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

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

 更新時(shí)間:2014年09月27日 16:26:20   作者:Mr.Ant  
這篇文章主要介紹了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ò)的問題。

下面出現(xiàn)的迭代器很好的解決了這個(gè)問題,就不必為每次的泛型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的寫法可以改為下面的while寫法
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變量。

相關(guān)文章

  • Lua中執(zhí)行系統(tǒng)命令方法介紹

    Lua中執(zhí)行系統(tǒng)命令方法介紹

    這篇文章主要介紹了Lua中執(zhí)行系統(tǒng)命令方法介紹,Lua中有兩種方法可以執(zhí)行操作系統(tǒng)內(nèi)置命令,需要的朋友可以參考下
    2015-04-04
  • Lua中釋放table占用內(nèi)存的方法

    Lua中釋放table占用內(nèi)存的方法

    這篇文章主要介紹了Lua中釋放table占用內(nèi)存的方法,本文講解了兩種釋放內(nèi)存的方法,需要的朋友可以參考下
    2015-04-04
  • Lua性能優(yōu)化技巧(二):基本事實(shí)

    Lua性能優(yōu)化技巧(二):基本事實(shí)

    這篇文章主要介紹了Lua性能優(yōu)化技巧(二):基本事實(shí),本文講解了一些編譯器和寄存器的一些知識(shí),需要的朋友可以參考下
    2015-04-04
  • Lua中的基本語(yǔ)法、控制語(yǔ)句總結(jié)

    Lua中的基本語(yǔ)法、控制語(yǔ)句總結(jié)

    這篇文章主要介紹了Lua中的基本語(yǔ)法、控制語(yǔ)句總結(jié),本文總結(jié)了賦值、局部變量與塊、控制結(jié)構(gòu)、數(shù)字型for、泛型for等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua進(jìn)階教程之閉包函數(shù)、元表實(shí)例介紹

    Lua進(jìn)階教程之閉包函數(shù)、元表實(shí)例介紹

    這篇文章主要介紹了Lua進(jìn)階教程之閉包函數(shù)、元表實(shí)例介紹,本文詳細(xì)講解了Lua的閉包函數(shù)和元表,并同時(shí)和C++做了比較,需要的朋友可以參考下
    2014-09-09
  • 使用Lua來(lái)擴(kuò)展C++程序的方法

    使用Lua來(lái)擴(kuò)展C++程序的方法

    這篇文章主要介紹了使用Lua來(lái)擴(kuò)展C++程序的方法,盡管更多的時(shí)候人們或許會(huì)想用C++來(lái)擴(kuò)展Lua...需要的朋友可以參考下
    2015-07-07
  • 在Mac OS中安裝Lua的教程

    在Mac OS中安裝Lua的教程

    這篇文章主要介紹了在Mac OS中安裝Lua的教程,盡管基于Unix的Mac OS并沒有集成Lua解釋器,但安裝起來(lái)依然super easy:)需要的朋友可以參考下
    2015-07-07
  • Lua編程中的一些基本語(yǔ)法整理

    Lua編程中的一些基本語(yǔ)法整理

    這篇文章主要介紹了Lua編程中的一些基本語(yǔ)法整理的相關(guān)資料,是Lua入門中最基礎(chǔ)的知識(shí),需要的朋友可以參考下
    2015-05-05
  • Lua教程(十三):弱引用table

    Lua教程(十三):弱引用table

    這篇文章主要介紹了Lua教程(十三):弱引用table,一個(gè)table的弱引用類型是通過(guò)其元表的__mode字段來(lái)決定的,如果該值為包含字符"k",那么table就是key弱引用,如果包含"v",則是value弱引用,如果兩個(gè)字符均存在,就是key/value弱引用,需要的朋友可以參考下
    2015-04-04
  • Lua 中 pairs 和 ipairs 的區(qū)別

    Lua 中 pairs 和 ipairs 的區(qū)別

    這篇文章主要介紹了Lua 中 pairs 和 ipairs 的區(qū)別,本文用官方文檔和代碼實(shí)例總結(jié)了它的們的區(qū)別,需要的朋友可以參考下
    2014-09-09

最新評(píng)論