lua 高级篇(二)

第七章  迭代器与泛型for

      迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素,在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。

   一、迭代器与闭包

   一个简单的例子: 我们为一个list写一个简单的迭代器,与ipairs()不同的是我们实现的这个迭代器返回元素的值而不是索引下标:

function list_iter(t)
    local i = 0
    local n = table.getn(t)
    return function ()
        i =  i + 1
        if i <= n then
            return t[i]
        end
    end
end

t = {10,20,30}
iter = list_iter(t) -- cerates the iterator

while true do
    local element = iter() -- calls the iterator
    if element == nil then
        break
    end
    print(element)
end

        下面看一个稍微高级一点的例子:我们写一个迭代器遍历一个文件内的所有匹配的单词。为了实现目的,我们需要保留两个值:当前行和在当前行的偏移量,我们使用两个外部局部变量line、pos保存这两个值。

function allwords()
    local line = io.read() -- current line
    local pos = 1          -- current position in the line
    return function ()     -- iterator function
        while line do      -- repeat while there are lines
            local s, e = string.find(line,"%w+",pos)
            if s then      -- found a word ?
                pos = e + 1 -- next position is after this word
                return string.sub(line,s,e) -- return the word
            else
                line = io.read()  -- word not foud; try next line
                pos = 1           -- restart from first position
            end
        end
    return nil  -- no more lines: end of travelsal
    end
end

for word in allwords() do
    print(word)
end

  二、范性for的语义

时间: 2024-10-08 11:09:20

lua 高级篇(二)的相关文章

lua 高级篇(一)

第六章: 再论函数 Lua 中的函数是带有词法定界(lexical scoping)的第一类值(first-class values). 第一类值指:在 Lua 中函数和其他值(数值.字符串)一样,函数可以被存放在变                  量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:被嵌套的函数可以访问他外部函数中的变量.这一特性给 Lua 提供了                 强大的编程能力. 先给出一些实例,看看lua的函数是如何跟普通变量一

iOS开发——高级篇——二维码的生产和读取

一.二维码的生成 从iOS7开始集成了二维码的生成和读取功能此前被广泛使用的zbarsdk目前不支持64位处理器 生成二维码的步骤:导入CoreImage框架通过滤镜CIFilter生成二维码 二维码的内容(传统的条形码只能放数字):纯文本名片URL // 1. 实例化二维码滤镜 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; // 2. 恢复滤镜的默认属性 [filter setDefaults];

lua基础篇(二)

元表 metatable:(元表)一组元操作(元方法)的集合; __index:元方法之一,作用:定义了新的索引操作; ????若索引表中没有的key,会去查找表的元方法,即metatable中的__index方法(也可以是另一个表) ????原型:__index = fuunction(table,key) ????????????????--此处的table为调用该元方法的 ????????????if type(key) == "number" then ????????????

Python网络编程之高级篇二

在上一篇中,我们深入探讨了TCP/IP协议的11种状态,理解这些状态对我们编写服务器的时候有很大的帮助,但一般写服务器都是使用C/Java语言,因为这些语言对高并发的支持特别好.我们写的这些简单的服务器主要是为了深入学习TCP/IP协议.IO操作以及Python中协程的原理.在上一篇中也提到非阻塞这个概念,在这一篇中,我们继续深入探讨IO模型,因为理解IO操作对我们深入学习异步编程有很大帮助.所以在这一节中我们主要是从Linux内核态和用户态的层面来考虑IO操作时会发生什么样的事情,Linux内

JAVA高级篇(二、JVM内存模型、内存管理之第二篇)

本文转自https://zhuanlan.zhihu.com/p/25713880. JVM的基础概念 JVM的中文名称叫Java虚拟机,它是由软件技术模拟出计算机运行的一个虚拟的计算机. JVM也充当着一个翻译官的角色,我们编写出的Java程序,是不能够被操作系统所直接识别的,这时候JVM的作用就体现出来了,它负责把我们的程序翻译给系统"听",告诉它我们的程序需要做什么操作. 我们都知道Java的程序需要经过编译后,产生.Class文件,JVM才能识别并运行它,JVM针对每个操作系统

Spark性能优化指南——高级篇

Spark性能优化指南--高级篇 [TOC] 前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题. 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 绝大多数tas

在Eclipse中使用JUnit4进行单元测试(高级篇)【转】

通过前 2 篇文章,您一定对 JUnit 有了一个基本的了解,下面我们来探讨一下JUnit4 中一些高级特性. 一.     高级 Fixture 上一篇文章中我们介绍了两个 Fixture 标注,分别是 @Before 和 @After ,我们来看看他们是否适合完成如下功能:有一个类是负责对大文件(超过 500 兆)进行读写,他的每一个方法都是对文件进行操作.换句话说,在调用每一个方法之前,我们都要打开一个大文件并读入文件内容,这绝对是一个非常耗费时间的操作.如果我们使用 @Before 和 

【转载】Spark性能优化指南——高级篇

前言 数据倾斜调优 调优概述 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 查看导致数据倾斜的key的数据分布情况 数据倾斜的解决方案 解决方案一:使用Hive ETL预处理数据 解决方案二:过滤少数导致倾斜的key 解决方案三:提高shuffle操作的并行度 解决方案四:两阶段聚合(局部聚合+全局聚合) 解决方案五:将reduce join转为map join 解决方案六:采样倾斜key并分拆join操作 解决方案七:使用随机前缀和扩容RDD进行join 解决方案八:多

PHP注入大全,分低级篇,中级篇,高级篇

谨以此献给黑客x档案的新手们 前言:现在的网络,最流行的攻击手段有两种,一种是缓冲区溢出攻击,一种是SQL注入,相对而言,最流行的还是脚本注入,而脚本注入漏洞更是风靡黑客界.不管是老鸟还是新起步的小菜,都会为它那巨大的威力和灵活多变的招式所着迷! 正是因为注入攻击的流行,使的市面上的注入工具层出不穷!比较出名的有小竹的NBSI.教主的HDSI和啊D的注入工具等等!这大大方便的小菜们掌握注入漏洞!可是,工具是死的,注入的手法却是活的,能否根据实际情况灵活地构造SQL注入语句,得到自己想要的信息,是