第7章迭代器与泛型for
7.1迭代器与closure
所谓“迭代器”就是一种可以遍历的(iterate over)一种集合中的所有元素的机制。在Lua中,通常将迭代器表示为函数。每调用一次函数,即返回集合中的下一个元素。一个closure就是一种可以访问其外部嵌套环境中的局部变量的函数。
closure的例子:
function values(t)
locali = 0
returnfunction() i=i+1; return t[i] end
end
t = {10, 20, 30}
iter = values(t) --创建迭代器
while true do
local element = iter() --调用迭代器
if element == nil then break end
print(element)
end
for element in values(t) do
print(element)
end
7.2泛型for的语义
泛型for语法如下:
for <var-list> in<exp-list> do
<body>
end
其中<var-list>是一个或多个变量名的列表,以逗号分隔;<exp-list>是一个或多个表达式的列表,同样以逗号分隔。通常表达式列表只有一个元素,即一句对迭代器工厂的调用。例如,以下代码:
fork,v in pairs(t) do print(k,v) end
7.3 无状态的迭代器
一种自身不保存任何状态的迭代器。
实现ipairs:
local function iter(a,i)
i = i+1
local v=a[i]
if v then
return i,v
end
end
function ipairs(a)
returniter,a,0
end
t = {10,2,18}
for i,v in ipairs(t) do
print(v)
end
7.4 具有复杂状态的迭代器
local iterator
function allwords()
localstate = { line = io.read(), pos = 1}
returniterator,state
end
function iterator(state)
while state.line do
locals,e = string.find(state.line, "%w+", pos)
if s then
state.pos= e+1
returnstring.sub(state.line, s, e)
else
state.line=io.read()
state.pos= 1
end
end
return nil
end
7.5 真正的迭代器
function allwords(f)
forline in io.lines() do
forword in string.gmatch(line, "%w+") do
f(word) -- 调用函数
end
end
end
第8章 编译、执行与错误
8.1 编译
loadstring函数与loadfile函数类似,不同之处在于它是从一个字符串中读取代码,而非从文件中读取。例如,以下代码:
f = loadstring(“i=i+1”)
f就变成了一个函数,每次调用时就执行“i=i+1”:
i=0
f();print(i) -- 1
f();print(i) -- 2
loadstring总是在全局环境中编译它的字符串。
载入lua文件,有文件foo.lua内容如下:
funtionfoo(x)
print(x)
end
执行以下代码:
f= loadfile(“foo.lua”)
这样函数foo就完成编译了,但是还没有定义它。要定义它,就要执行以下程序块:
print(foo) ànil
f() --定义foo
foo(“ok”) àok
8.2 代码
动态链接:package.loadlib
两个参数:动态库的完整路径和一个函数的名称
例如:
local path = “/usr/local/lib/lua/5.1/socket.so”
local f = package.loadlib(path, “luaopen_socket”)
8.3 错误
函数:error()、assert()。
(1) print“enter a number:”
n = io.read(“*number”)
if not n then error(“invalid input”)end
(2) print“enter a number:”
n = assert(io.read(“*number”), “invalidinput”)
8.4 错误处理与异常
函数:pcall()。
要在Lua中处理错误,则必须使用函数pcall来包装需要执行的代码。
8.1 错误消息与追溯(traceback)
略
第9章… 请看该系列的下一篇