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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值