Lua old-style true iterator

老版本的Lua不支持for语句, 可以在函数中写循环来达到循环的目的.
以下是书上的例子, 显然函数里面用了for, 所以有点毛病.

> function allwords(f)
>>   for line in io.lines() do
>>     for word in string.gmatch(line, "%w+") do
>>       f(word)
>>     end
>>   end
>> end
-- 调用allwords函数, 使用print函数打印单词
> allwords(print)
hello nihao yes, now no
hello
nihao
yes
now
no

-- allwords传入一个匿名函数, 统计hello出现的次数

> do
>> local count = 0
>> allwords( function (w) if w == "hello" then count = count +1 end end )
>> print(count)
>> end
hello, nihao, yes, hello
Hello, hello
3

allwords在generic for中的用法, 上一篇文章的例子

2. 使用closure的例子, 将状态值存储在closure中.
factory函数, 返回iterator匿名函数以及state状态值. state封装在iterator匿名函数中.
> function allwords()
>>    local state = {line = io.read(), pos = 1}  -- 使用factory函数的local变量表存储状态值, 对iterator来说就是non-local变量
>>    return function (state)
>>    while state.line do  -- 重复直到最后一行
>>      local s,e = string.find(state.line, "%w+", state.pos)  -- 查找单词
>>      if s then
>>        state.pos = e+1
>>        return string.sub(state.line, s, e)  -- 返回单词
>>      else  -- 否则下一行
>>        state.line = io.read()
>>        state.pos = 1
>>      end
>>    end
>>    return nil  -- 如果没有值, iterator函数返回nil给控制变量, 因此结束generic for循环.
>>  end, state
>> end

> for w in allwords() do
>>  print (w)
>> end
hello nihao a
hello
nihao
a
时间: 2025-01-22 10:30:33

Lua old-style true iterator的相关文章

用lua_tinker将lua脚本嵌入到游戏服务器

      忙中偷闲,经过几天的努力,将lua脚本嵌入到系统中.之前公司的时候,偌大一个服务器全部使用C++编写,对于新手经常发生一些宕机事件,被主程责骂.在后来接触的一些人中,发现很多公,都已经引入lua来适应多变的环境和敏捷开发!正如一个主程所说的,在n年前网易已经脚本为王了,现在很多公司拿着C++不放,作为开发人员不苦逼才怪! 想想在广州开发游戏的日子,每次在群里面看到运维说某某服务器上面有coredump文件时,总是惊出冷汗,赶紧用gdb去查询,是哪行代码引起的宕机:还要应对主程的责骂!

Lua基础---运算符

众所周知,C,C++,python等语言都有运算符,那么Lua也不例外,因为它是C写的嘛! Lua分为主要三类运算符,分别是算术运算符,关系运算符,逻辑运算符,还有特殊运算符. 1.算术运算符有: + (加)   -(减)   *(乘)  /(除)   %(取模)   ^(求幂)   -(符号) 来看一个例子:test6.lua num1 = 4 ; num2 = 2 ; print(num1+num2); print(num1-num2); print(num1*num2); print(nu

Lua语言在Wireshark中使用(转)

1.       检查Wireshark的版本是否支持Lua 打开Wireshark,点击"HelpàAbout Wireshark"菜单,查看弹出的对话框,如果有"with Lua 5.1"表示支持Lua语言扩展,如果有"without Lua"表示不支持Lua扩展.   2.       启用LUA 在全局配置文件中启用LUA的方法是从init.lua文件中删除disable_lua这一行.该文件可以通过点击"HelpàAbout

R 语言 语法特点

R语言常用语法 1.R语言创建向量和矩阵 (1).c() 用c()来创建一个向量 例:创建向量x1与x2 > x1 = c(1,3,5,7,9) > x1 [1] 1 3 5 7 9 > x2 = c(0,2,4,6,8) > x2 [1] 0 2 4 6 8 > (2).length() 用length()来求一个向量的长度 例: > length(x1) [1] 5 > length(x2) [1] 5 > (3).mode() 用mode()来显示数据

JAVA集合框架之List接口实现类

上一篇博客<JAVA集合框架之Set接口实现类>中介绍了Set接口的相关实现类,这一篇将介绍List接口的实现类. java.util.ArrayList< E > ArrayList有点类似于数组,相比较于数组而言,ArrayList可以动态的更改元素个数,相对于数组较为灵活. 每个 ArrayList 实例都有一个容量.该容量是指用来存储列表元素的数组的大小.它总是至少等于列表的大小.随着向 ArrayList 中不断添加元素,其容量也自动增长.并未指定增长策略的细节,因为这不

javascript开发随笔二 动态加载js和文件_javascript技巧

这时候最好的做法就是按需引入,动态引入组件js和样式,文件load完成后调用callback,运行js.代码还是很简便的 1. 判断文件load完成.加载状态ie为onreadystatechange,其他为onload.onerror 复制代码 代码如下: if(isie){ Res.onreadystatechange = function(){ if(Res.readyState == 'complete' || Res.readyState == 'loaded'){ Res.onrea

SFTP &amp;amp; FTP Upload

简述 >> FTP: 1. Install FTP service on Linux(Red Hat) as root user    [root]# yum install ftp 2. Configure FTP as root user a) Be clear with below properties, and configure them in the file /etc/vsftpd/vsftpd.conf as root user      # Uncomment this to

Es6系列之generator基础篇

Ecmascript 6简称es6,是javascript下一代标准,还处在开发阶段,估计2014年底发布,有关更多浏览器对es6的支持情况,点击这里 今天说说es6里新增的Generators. 下面是Generator系列的相关文章链接 Generator基础篇 深入Generator之异常处理与相互调用 深入Generator之异步方法处理 深入Generator之协程处理 Generator generator简单的说就是提供了一种控制函数内部执行状态的功能,以往的普通函数只要开始执行则

java学习笔记11--集合总结

Java集合框架概述 集合就是将若干用途相同.近似的"数据"结合成一个整体. 集合从体系上分为三种: (1) 列表(List):List集合区分元素的顺序,允许包含相同的元素. (2) 集(Set):Set集合不区分元素的顺序,不允许包含相同的元素. (3) 映射(Map):Map集合保存的"键"-"值"对,"键"不能重复,而且一个"键"只能对应一个"值". Java集合中只能保存引用数