Lua程序设计 泛型for的定义

泛型for在循环过程内部保存了迭代器函数。实际上他保存着3个值:一个迭代器函数、一个恒定状态和一个控制变量。

泛型for的语法如下:
  for <var-list> in <exp-list>  do
  end
 其中,<var-list>是一个或多个变量名的列表,以逗号分隔;<exp-list>是一个或多个表达式的列表,同样以逗号分隔。通常表达式列表只有一个元素,即一句迭代器工厂的调用。
 
 for k, v in pairs(t) do print(k, v) end
 这其中,变量列表是"k,v",表达式列表只有一个元素pairs(t)。一般来说变量列表中也只有一个变量。
 for line in io.lines() do
    io.write(line, "\n")
 end
 
 变量列表的第一个元素称为"控制变量"。在循环过程中该值绝不会为 nil,因为当他为nil时循环就结束了。

for 做的第一件事就是对in后面的表达式进行求值。这些表达式应该返回3个值供for保存:
             迭代器函数、恒定状态和控制变量的初值。即只有最后一个表达式才会产生多个结果,并且只会保留前3个值,多余的值会被丢弃;而不足的话将以nil补足。

在初始化步骤之后,for会以恒定状态和控制变量来调用迭代器函数。然后for将迭代器函数的返回值赋予变量列表中的变量。如果第一个返回值为nil,那么循环终止。否则,for执行它的循环体,随后再次调用迭代器函数,并重复这个过程。

更明确的说,以下语句:

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

因此,假设迭代器函数为f,恒定状态为s,控制变量的初值为a0。那么在循环过程中控制变量的值依次为a1 = f(s, a0) ,a2 = f(s, a1),依次类推,直至ai为nil结束循环。如果for还有其他变量,那么它们也会在每次调用f后获得额外的值。

Lua程序设计 泛型for的定义,布布扣,bubuko.com

时间: 2024-10-06 16:45:12

Lua程序设计 泛型for的定义的相关文章

Lua程序设计 深入函数01

在Lua中,函数是一种"第一类值":表示在Lua中的函数与其他传统类型的值(例如:数字和字符串)是一样的,可以存储到变量(全局,局部均可)或table中,可以作为实参传递给其他函数,还可以作为其他函数的返回值. "词法域":指一个函数可以嵌套在另一个函数中,内部的函数可以访问外部函数中的变量. Lua中的函数与所有其他值一样都是匿名的,当讨论一个函数时,实际上是在讨论一个持有某函数的变量.这与变量持有各种值一个道理,可以以多种方式来操作这些变量. a = {p = 

Lua程序设计 非全局的函数

由于函数是一种"第一类值",因此一个显而易见的推论就是,函数不仅可以存储在全局变量中,还可以存储在table的字段和局部变量中. 大部分Lua库也采用了这种将函数存储在字段中的机制(io.read.math.sin).若要在Lua中创建这种函数,只需将常规的函数语法与table语法结合起来使用即可: lib = {} lib.foo = function(x,y) return x + y end  lib.goo = function(x,y) return x - y end 也可

《lua程序设计 第二版》 学习笔记6 -------- 深入函数

-- 第6章 深入函数 -- 函数是一种"第一类值",他们具有特定的"词法域" -- "第一类值":与其他传统类型的值具有相同的权利.例如:存储到变量/table中,作为实参传递给函数或者作为其他函数的返回值 -- "词法域":一个函数可以嵌套在另一个函数中,内部函数可以反问外部函数的变量. local function testFun(x) return 2 * x end -- 函数定义方式1 local testFun

Lua程序设计 迭代器与closure

所谓"迭代器"就是一种可以遍历一种集合中所有元素的机制.在Lua中,通常将迭代器表示为函数.每调用一次函数,即返回集合中的"下一个"元素. 每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置及如何步进到下一个位置.在Lua中,closure对于这类任务提供了极佳的支持,一个closure就是一种可以访问其外部嵌套环境中的局部变量的函数.对于closure而言,这些变量就可用于在成功调用之间保持状态值,从而使closure可以记住它在一次遍历中所

Lua程序设计 函数 正确的尾调用

Lua中的"尾调用"就是一种类似于goto的函数调用,当一个函数调用是另一个函数的最后一个动作时,该调用才算是一条"尾调用".[一个函数在调用完另一个函数之后,是否就无其他事情需要做了] function f(x) return g(x) end   也就是说,当f调用完g之后,f所代表的整个函数的调用才算执行完成也就无其他事情可做了.因此,这种情况中,程序就不需要返回那个"尾调用"所在的函数了. 所以在"尾调用"之后,程序也

Lua程序设计入门

在Lua中,一切都是变量,除了关键字.TTMD强大了. 1.注释 -- 表示注释一行 --[[ ]]表示注释一段代码,相当于C语言的/*....*/ 注意:[[ ... ]]表示一段字符串 2.lua编程 先从最简单的来了解lua吧 print("Hello Lua") --打印结果:Hello Lua 在Lua中,语句之间可以用分号";"隔开,也可以用空白隔开.一般来说,如果多个语句写在同一行的话,建议总是用分号隔开. a.控制语句 Lua 有好几种程序控制语句,

《lua程序设计(第二版)》学习笔记(二)

直接上代码 1: -- 第2章 类型与值 2: -- 动态类型的语言,每个值都携带自身类型信息 3: print("类型打印,每个值都携带自身类型"); 4: print(type("Hello world")); -- string 完全采用8位编码,字符可以具有任何数值编码,可以将任意二进制数据存储到字符串中 5: --[[ 6: string是不可变值,不能像C一样修改一个字符创中某个字符,而是应该 7: 创建一个新的字符串; 8: 和其他对象一样,都是自动内

Lua程序设计(第二版)学习笔记(一)

前段时间认真的看了一下<lua程序设计(第二版)>这本书,每一章写一个lua脚本,诸多注释,相信给初学者有一定帮助. -- 第一章代码 print("hello Hello"); -- 全局函数 function face(n) if n == 0 then return 1 else return n + face(n - 1) end end print(face(100)); -- 1.1 程序快(chunk) -- 每段代码,源代码文件或者交互模式 的 一行 代码,

Lua程序设计 closure(闭合函数)

若将一个函数写在另一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特征称之为"词法域". 假设有一个学生姓名的列表和一个对应于每个姓名的年级列表,需要根据每个学生的年纪来对他们的姓名进行排序. names = {"Peter", "Paul", "Mary"} grades = {Mary = 10, Paul = 7, Peter = 8} table.sort(names, function(n1,