closure
能夠保存迭代器所需保存的全部狀態table
並保存在 恆定狀態中 table
table
的內容卻能夠改變即在循環過程當中改變 table
數據local iterator function allwords() local state = {line = io.read(), pos = 1} return iterator, state end function iterator(state) while state.line do -- 若爲有效行的內容就進入循環 -- 搜索下一個單詞 local s, e = string.find(state.line, "%w+", state.pos) if s then -- 找到一個單詞 state.pos = e + 1 return string.sub(state.line, s, e) else -- 沒有找到單詞 state.line = io.read() -- 嘗試讀取下一行 state.pos = 1 end end return nil end
錯誤記錄
io.read
,而不是函數調用 io.read()
bad argument #1 to 'find' (string expected, got function)
string
類型,實際上獲得的確實 function
類型string.find(state.line, ...)
其中的 第一個參數已經爲 function
類型了,因此循環結束io.read()
用戶輸入任何東西都會爲 string
類型io.read("*number")
這樣就指定用戶輸入爲 number
類型了for
變量中closure
實現的 table
比一個使用 table
的迭代器高效table
快 for
循環function allwords(f) for line in io.read() do -- gmatch 匹配全部符合模式的字符串 for word in string.gmatch(line, "%w+") do f(word) end end end allwords(print) local count = 0 allwords(function(w) if w == "hello" then count = count + 1 end end ) print(count) local count = 0 for w in allwords() do if w == "hello" then count = count + 1 end end print(count)
生成器容許兩個或多個並行的迭代過程git
break
和 return
語句