麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

Lua中的迭代器和泛型for實例

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

1、迭代器與closure

在lua中,迭代器通常為函數,每調用一次函數,會返回集合中的下一個元素。每個迭代器在成功調用的時候,都需要保存一些狀態,closure(閉包)完美為迭代器運用而生。

 

復制代碼 代碼如下:

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

 

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

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

 

從上面的例子可以看出,范型for相對于while給我們提供了更為清晰的實現邏輯。luo的內部函數已經為我們提供了迭代函數,運行foreach時我們會調用隱式的迭代器。

2、泛型for的語義

上面的迭代器有一個明顯的缺點,就是每次循環時都要創建一個新的closure變量,而不能運用之前已經創建好了的closure變量,如果我在這個循環外再加一個循環進行迭代時,這就成了一個很繁瑣并且容易出錯的問題。

下面出現的迭代器很好的解決了這個問題,就不必為每次的泛型for都創建一個新的closure變量了。

 

復制代碼 代碼如下:

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在這里只是一個函數變量,并不是調用函數
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
--輸出結果
--1 one
--2 two
--3 three
--1 one
--2 two
--3 three

 

3、無狀態迭代器

 

復制代碼 代碼如下:

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

 

通過上面的例子可以看出,可以無限次運用list變量和調用traverse函數而不必像第一種情況那樣每次循環之前都創建新的closure變量。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 毛片电影网址 | 性猛交ⅹxxx乱巴西 欧美日韩1区2区3区 | 天天色综合2 | 一区二区久久精品66国产精品 | 成人在线视频网 | 曰批全过程120分钟免费69 | 国产精品成人亚洲一区二区 | 九色国产| 欧美人的天堂一区二区三区 | 国产精品视频1区 | 国产精品1区 | 久久成人激情视频 | 欧美日本另类 | 国产亚洲精品久久久久久久久久 | 精品国产91久久久久久浪潮蜜月 | 一级毛片免费一级 | 久草在线视频网 | 久久精品国产99久久6动漫亮点 | 成人一区二区三区在线 | 久久中文一区 | 国产成人综合在线视频 | chinese xvideos gay| 亚洲精品v天堂中文字幕 | 国产一区视频免费观看 | 免费久久久久久 | 久久精品日产第一区二区三区 | 久久久久久久久久网站 | 国产精品自拍av | 大学生一级毛片 | 国产一区精品视频 | 久久av一区二区 | 久草干| 日本一区视频在线观看 | 国产在线导航 | 精品一区二区三区在线播放 | 神马福利网 | 色偷偷欧美 | 成人综合一区二区 | 免费观看国产精品视频 | 国内毛片视频 | 天天躁狠狠躁夜躁2020挡不住 |