好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Lua中的迭代器和泛型for學習總結

Lua中的迭代器和泛型for學習總結

熱門標簽:上海企業外呼系統排名 電腦外呼系統輻射大嗎 開通400電話申請流程 武漢百應人工智能電銷機器人 揚州電銷外呼系統軟件 智能語音電銷的機器人 百度地圖標注位置網站 如何利用高德地圖標注家 400手機電話免費辦理

前言

迭代器就是一種可以遍歷一種集合中所有元素的機制,在Lua中,通常將迭代器表示為函數。每調用一次函數,就返回集合中的“下一個”元素。每個迭代器都需要在每次成功調用之后保存一些狀態,這樣才能知道它所在的位置及如何走到下一個位置,通過之前博文的總結,閉包對于這樣的任務提供了極佳的支持?,F在我們就用代碼來實現一個簡單的迭代器。

復制代碼 代碼如下:

function values(tb)
     local i = 0
     return function ()
          i = i + 1
          return tb[i]
     end
end
 
local testTb = {10, 20, 30}
for value in values(testTb) do
     print(value)
end

這就是一個最簡單的迭代器,使用閉包來完成整個任務;這只是一個簡單的例子,接下來,再看看泛型for的語義。

泛型for的語義

泛型for比較復雜,它在循環過程內保存了迭代器函數。它實際上保存著3個值:一個迭代器函數、一個恒定狀態和一個控制變量。接下來,分別進行總結。
泛型for的語法如下:

復制代碼 代碼如下:

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

其中,var-list>是一個或多個變量名的列表,以逗號分隔;exp-list>是一個或多個表達式的列表,同樣以逗號分隔。通常表達式列表只有一個元素,即一句對迭代器函數的調用。例如:

復制代碼 代碼如下:

for k, v in pairs(t) do print(k, v) end

for做的第一件事就是對in后面的表達式求值,這些表達式應該返回3個值供for保存:迭代器函數、恒定狀態和控制變量的初值。這里和多重賦值是一樣的,只有最后一個表達式才會產生多個結果,并且只會保留前3個值,多余的值會被丟棄;而不夠的話,就以nil補足。

在初始化完成以后,for會以恒定狀態和控制變量來調用迭代器函數。然后for將迭代器函數的返回值賦予變量列表中的變量。如果第一個返回值為nil,那么循環就終止,否則,for執行它的循環體,隨后再次調用迭代器函數,并重復這個過程。在前言部分的代碼中,只是返回了迭代器函數,并沒有返回恒定狀態和控制變量。下面通過代碼來說明這個問題,比如:

復制代碼 代碼如下:

for var_1, ..., var_n in explist> do block> end -- 就等價于以下代碼:
do
     local _f, _s, _var = explist>    -- 返回迭代器函數、恒定狀態和控制變量的初值
     while true do
          local var_1, ..., var_n = _f(_s, _var)
          _var = var_1
          if _var == nil then break end
          block>
          end
     end
end

無狀態的迭代器

所謂“無狀態的迭代器”,就是一種自身不保存任何狀態的迭代器。因此,我們可以在多個循環中使用同一個無狀態的迭代器,避免創建新的閉包的開銷。

在每次迭代中,for循環都會用恒定狀態和控制變量來調用迭代器函數。一個無狀態的迭代器可以根據這兩個值來為下次迭代生成下一個元素。這類迭代器的代表就是ipairs。它可以用來迭代一個數組的所有元素。如下述演示代碼:

復制代碼 代碼如下:

local aTb = {"One", "Two", "Three"}
for i, v in ipairs(aTb) do
     print(i, v)
end

在這里,迭代器狀態就是需要遍歷的table(一個恒定狀態,它不會在循環中改變)及當前的索引值(控制變量)。我們可以使用Lua代碼來實現ipairs,大概就如下代碼:

復制代碼 代碼如下:

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

函數pairs與ipairs類似,也是用于遍歷一個table中的所有元素。不同的是,它的迭代器函數是Lua中的一個基本函next。
復制代碼 代碼如下:

function pairs(a)
     return next, t, nil
end

在調用next(t, k)時,k是table t的一個key。此調用會以table中的任意次序返回一組值:此table的下一個key,及這個key所對應的值。而調用next(t, nil)時,返回table的第一組值。若沒有下一組值時,next返回nil。所以,我們也可以使用next來判斷一個table是否為空。

對于大家經常迷惑的ipairs和pairs的區別,在這里就能看的一清二楚了,ipairs只能用于遍歷index是整型的table,同時,由于ipairs返回的控制變量初值為0,這就決定了,ipairs只能訪問index從1開始的key和value;ipairs不能返回nil,當key對應的值為nil時,就直接終止遍歷;而pairs則沒有要求。關于ipairs和pairs的具體差異,請參考這篇博文:點這里。

當然了,有了無狀態的迭代器,就有了有狀態的迭代器了,有狀態的迭代器就是專門用一個table來保存狀態;在無狀態的迭代器中,我們每一次都是迭代一個table,這個table就是一個無狀態的table,它不會再遍歷的過程中發生變化,而有狀態的迭代器,則會在遍歷的過程中對迭代的table進行變更,迭代的table的狀態也隨之發生了變化。這里不做詳細的總結。

您可能感興趣的文章:
  • 深入解讀Lua中迭代器與泛型for的使用
  • 淺析Lua中的迭代器
  • Lua教程(五):迭代器和泛型for
  • Lua中的迭代器和泛型for介紹
  • Lua中的迭代器和泛型for實例
  • Lua中的迭代器(iterator)淺析
  • Lua的迭代器使用中應該避免的問題和技巧
  • Lua中的for循環和迭代器的秘密探究
  • Lua中的迭代器淺析
  • Lua基礎迭代器的使用實例

標簽:黑龍江 新余 江西 武漢 延邊 嘉峪關 張掖 宜賓

巨人網絡通訊聲明:本文標題《Lua中的迭代器和泛型for學習總結》,本文關鍵詞  Lua,中的,迭代,器,和,泛型,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua中的迭代器和泛型for學習總結》相關的同類信息!
  • 本頁收集關于Lua中的迭代器和泛型for學習總結的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 女人被暴躁C到高潮容易怀孕吗| 囯产精品久久久久久久久久小说| 大肚子孕妇孕交| 3p辣文| 名器奶婬H肉承欲欢np天美传媒| 秋霞鲁丝影院久久人人综合| japanese18一19hdxxⅹ| 扒开老师的湿润小泬喷白浆网站| 中国hdxxxx护士| 女人喜欢被囗交48种姿势图| 人妻熟女久久久久久| 人人干人人艹| 狠狠狠的在啪线香蕉亚洲应用| 啊…啊用力宝玉| japanesegay男男gay同| 18末成年禁止进入免费观看| 口述很黄很乱小说| VG片αAA免费观看| 国产三级视频在线观看| 亚洲国产网站| 福利视频三区| 1区1区3区4区产品乱码区| 修正帶系列 長立826| 日本人妻の电车痴汉Av| ??老师脱裤子让我C电影| 清纯女学生被虐受辱np| 久久曰视频| 制服丝袜第一页在线观看| 女王虐茎捆蛋视频| 国产人妻人伦精品1国产| 美女被强行扒开双腿被桶屁股| 午夜人体视频| 99热久这里都是精品小草| 被主人在办公室里露出调教| 两个攻互攻互c受H| 夜夜爽77777妓女免费下载| 花唇用力吞吐h| 调教侵犯小男生(h)| 国产做受???麻豆| 97精品国产AV片国产色戒| 国产丝袜精品丝袜久久|