您的位置:首页 > 编程语言 > Lua

《Lua程序设计[第二版]》第7,8章笔记

2012-10-16 23:58 239 查看

第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章… 请看该系列的下一篇

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: