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

首頁 > 開發 > 綜合 > 正文

深入解讀Lua中迭代器與泛型for的使用

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

泛型for原理

迭代器是一種可以遍歷集合中所有元素的機制,在Lua中通常將迭代器表示為函數,每調用一次函數,就返回集合中“下一個”元素。每個迭代器都需要在每次成功調用之間保持一些狀態,這樣才能知道它所在的位置及如何步進到下一個位置,closure就可以完成此項工作。下面的示例是列表的一個簡單的迭代器:

function values(t) local i = 0 return function() i = i + 1; return t[i] endend

循環調用:

t = {10, 20, 30}iter = values(t)while true do local el = iter() if el == nil then break end print(el)end

泛型for調用

for el in values(t) do print(el) end

泛型for為一次迭代循環做了所有的簿記工作。它在內部保存了迭代器函數,并在每次迭代時調用迭代器,在迭代器返回nil時結束循環。實際上泛型for保存了3個值:迭代器函數f、恒定狀態s、控制變量a。for做的第一件事就是對in后面的表達式求值,并返回3個值供for保存;接著for會以s和a來調用f。在循環過程中控制變量的值依次為a1 = f(s, a0),a2 = f(s, a1),依次類推,直至ai為nil結束循環。

先看一段代碼

for element in list_iter(t) do  print(element) end 

在不往下看之前,我們可以先試圖根據我們已有的知識結構去理解這段代碼。如果這樣,list_iter(t)應該返回一個類似集合的東西,而我們已經知道實際上只返回了一個匿名函數,也就是迭代器。當然,每次調用迭代器都可以得到一個元素,迭代器的所有的結果倒是可以看成一個集合。因素齊了,我們需要一個邏輯上的解釋,這個邏輯就是 泛型for的語義。
先看文法規定:

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

整個過程是這樣的:
首先,初始化,計算 in 后面表達式的值,表達式應該返回 泛型for 需要的三個值:迭代函數、狀態常量、控制變量;與多值賦值一樣,如果表達式返回的結果個數不足三個會自

動用nil 補足,多出部分會被忽略。
第二,將狀態常量和控制變量作為參數調用迭代函數(注意:對于 for 結構來說,狀態常量沒有用處,僅僅在初始化時獲取他的值并傳遞給迭代函數)。

第三,將迭代函數返回的值賦給變量列表。
第四,如果返回的第一個值為 nil 循環結束,否則執行循環體。
第五,回到第二步再次調用迭代函數。

更具體地說:

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 

 泛型 for 在自己內部保存三個值:迭代函數、狀態常量、控制變量。

迭代器的狀態

無狀態的迭代器本身不保存任何狀態,for循環只會用恒定狀態和控制變量來調用迭代器函數。這類迭代器典型例子就是ipairs,下面是ipairs的Lua實現:

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

當for循環調用ipairs(list)時,會獲得3個值,然后Lua調用iter(list, 0)得到list, list[1],調用iter(list, 1)得到list, list[2],知道得到一個nil為止。

雖然泛型for只提供一個恒定狀態和一個控制變量用于狀態的保存,但有時需要保存許多其他狀態。這時可以用closure來保存,或者將所需的狀態打包為一個table,并保存在恒定狀態中。

閉包、迭代器和泛型for

到現在,Lua為我們準備了三塊積木:閉包、泛型for和迭代器。一個循環,我們可以利用閉包+迭代器,也可以使用泛型for+迭代器。那我們該怎么取舍呢?Lua也給出了建

議。

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  for i, v in ipairs(a) do  print(i, v) end 

這種情況是Lua最推薦的,迭代器不依賴upvalue,不產生閉包,狀態常量和控制變量借助泛型for保存,通過迭代器的參數傳遞給了迭代器。
再給一個書中的例子:

local iterator -- to be defined later  function allwords()  local state = {line = io.read(), pos = 1}  return iterator, state end  function iterator (state)  while state.line do -- repeat while there are lines   -- search for next word   local s, e = string.find(state.line, "%w+", state.pos)   if s then -- found a word?    -- update next position (after this word)    state.pos = e + 1    return string.sub(state.line, s, e)   else -- word not found    state.line = io.read() -- try next line...    state.pos = 1 -- ... from first position   end  end  return nil -- no more lines: end loop end 

這樣好不好呢,Lua給的答案是否定的。書中有一段話說得很清楚:
我們應該盡可能的寫無狀態的迭代器,因為這樣循環的時候由for 來保存狀態,不需要創建對象花費的代價??;如果不能用無狀態的迭代器實現,應盡可能使用閉包;盡可能不

要使用table 這種方式,因為創建閉包的代價要比創建table 小,另外Lua 處理閉包要比處理table 速度快些。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线资源| 欧美日韩中国免费专区在线看| 国产精品人成电影在线观看| 国产精品成人久久久久| 国产亚洲在线播放| 91在线无精精品一区二区| 国产精品444| 亚洲天堂av在线免费观看| 日韩av免费在线播放| 国产精品永久在线| 成人网在线观看| 国产精品啪视频| 国产精品久久久久91| 久久精品国产亚洲7777| 日本精品久久久久影院| 亚洲男人天堂手机在线| 国产精品视频永久免费播放| 91高潮精品免费porn| 97国产一区二区精品久久呦| 国产精品爱啪在线线免费观看| 92版电视剧仙鹤神针在线观看| 国产午夜精品全部视频播放| 欧美丝袜美女中出在线| 中国china体内裑精亚洲片| 国产精品视频最多的网站| 国内精品久久久久久久久| 亚洲欧美在线免费观看| 亚洲精品日韩激情在线电影| 国产精品久久中文| 欧美性猛交xxxx富婆弯腰| 国产一区二区丝袜高跟鞋图片| 欧美一级视频在线观看| 亚洲性夜色噜噜噜7777| 日韩成人av一区| 日韩精品视频免费在线观看| 91精品国产91久久久久久| 久久韩剧网电视剧| 狠狠躁18三区二区一区| 成人中文字幕+乱码+中文字幕| 亚洲色图第三页| 亚洲欧美999| 亚洲欧洲在线视频| 日韩av综合网| www.日韩欧美| 欧美精品一区二区免费| 中文字幕免费精品一区高清| 韩国视频理论视频久久| 国产精品视频1区| 欧美性生交xxxxx久久久| 欧美黑人性视频| 精品国产欧美一区二区五十路| 亚洲精品一区中文字幕乱码| 国产精品一区二区三区成人| 97激碰免费视频| 亚洲成avwww人| 国产一级揄自揄精品视频| 中文字幕最新精品| 亚洲精品久久7777777| 午夜精品一区二区三区在线视| 综合欧美国产视频二区| 91精品国产高清自在线看超| 欧美成人午夜免费视在线看片| 久热精品在线视频| 欧美伊久线香蕉线新在线| 国产精品爽爽爽爽爽爽在线观看| 欧美一级黑人aaaaaaa做受| 亚洲а∨天堂久久精品9966| 精品国产乱码久久久久久婷婷| 69av成年福利视频| 日本不卡免费高清视频| 欧美午夜电影在线| 性色av香蕉一区二区| 欧美裸体xxxx极品少妇软件| 亚洲黄色av女优在线观看| 国产精品啪视频| 国产欧美精品一区二区三区-老狼| 国产亚洲精品久久久久久牛牛| 九九九久久国产免费| 国产一区二区黑人欧美xxxx| 久久免费视频观看| 日韩欧美一区二区在线| 欧美国产视频一区二区| 成人97在线观看视频| 国内精品久久久久久中文字幕| 福利视频第一区| www.久久草.com| 久久精品国产一区二区电影| 亚洲一区av在线播放| 精品呦交小u女在线| 欧美激情乱人伦一区| 亚洲最新av在线网站| 一个人看的www欧美| 全球成人中文在线| 国产精品电影久久久久电影网| 俺去啦;欧美日韩| 欧美激情视频在线观看| 97在线免费视频| 亚洲成avwww人| 成人伊人精品色xxxx视频| 91av中文字幕| 国产+成+人+亚洲欧洲| 这里只有精品久久| 亚洲最大在线视频| 亚洲视频在线观看| 久久影视电视剧免费网站清宫辞电视| 亚洲最大av在线| 国产精品情侣自拍| 亚洲国产欧美一区二区三区同亚洲| 国内精品久久久久久久| xxx成人少妇69| 另类少妇人与禽zozz0性伦| 日韩欧美国产黄色| 欧美激情欧美狂野欧美精品| 国产女精品视频网站免费| 亚洲精品一区二区久| 亚洲欧美日韩中文视频| 国产午夜精品视频免费不卡69堂| 狠狠操狠狠色综合网| 久久99久久99精品免观看粉嫩| 国模视频一区二区| 国产视频精品在线| 一区二区三区四区视频| 久久免费精品视频| 欧美三级欧美成人高清www| 亚洲深夜福利网站| 日韩欧美在线视频免费观看| 91视频-88av| 欧美一区三区三区高中清蜜桃| 欧美视频免费在线观看| 5278欧美一区二区三区| 欧美洲成人男女午夜视频| 国产精品久久77777| 日本高清视频精品| 日韩av成人在线| 疯狂做受xxxx高潮欧美日本| 91免费在线视频网站| 欧美性猛交xxxx| 久久精品99久久久香蕉| 精品久久久久久国产| 国产97免费视| 国产女人精品视频| 精品无码久久久久久国产| 亚洲精品永久免费精品| 国产精品久久一区主播| 伊人久久精品视频| 欧美国产日韩二区| 亚洲香蕉成视频在线观看| 亚洲欧美激情精品一区二区| 精品高清美女精品国产区| 亚洲激情免费观看| 亚洲精品aⅴ中文字幕乱码| 久久影院在线观看| 成人黄色免费片| 91精品中文在线| 九色精品免费永久在线| 韩剧1988在线观看免费完整版| 中文字幕av一区中文字幕天堂| 日韩精品免费综合视频在线播放| 亚洲黄一区二区| 在线日韩日本国产亚洲| 欧美有码在线观看| 国产精品自拍视频| 亚洲图片在线综合| 国产精品1234|