`
lua
  • 浏览: 74447 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Lua的Iterator以及函数心得

阅读更多

http://sunxiunan.com/?p=1249

 

local tbl = {"one", "two", "three", ‘five’}
local count = #tbl
local inc = 0

function Iter(tableinput)
return function()
if inc > count then
return
end
inc = inc + 1
return tableinput[inc], inc
end
end

for elem, index in Iter(tbl) do
print(elem)
if index > 2 then
inc = 0
end
end

如果运行一下的话,不出意外一定会死循环。如果把函数Iter改一下就是我们常见的generic for了。

function Iter(tableinput)
local count2 = #tbl
local inc2 = 0

return function()
if inc2 > count2 then
return
end
inc2 = inc2 + 1
return tableinput[inc2], inc2
end
end

跟踪一下运行也可以发现,count2以及inc2这两行在Iter被for调用的时候,只会第一次运行而且只运行一次。接下来的调用中只会从return function这里开始。如果返回nil,那么for就停止循环。

我比较好奇的是,对于Iter在for循环的时候,很显然是保持了一个内部的堆栈不变,也就是说inc2和count2类似于c语言的static内部变量。但是学的还是一知半解,不知道如何dump出此时的堆栈状态。

关于函数对于局部变量,好像是会在栈上做一个缓存,看下面代码

stringb = "bbbbbbbbbbbbbbb"
do
local internalA = "print for first time"
function printStrA()
print(internalA)
end
function printStrB()
print(stringb)
end
end

do
local internalA = "!!!!!!!!!!!!!!!!!!!!"
stringb = "cccccccccccccccc"
printStrA()
printStrB()
end

internalA = "!!!!2222222222222"
printStrA()
stringb = "ddddddddddddddddddd"
printStrB()

当我们运行这段代码,可以发现

print for first time
cccccccccccccccc
print for first time
ddddddddddddddddddd

也就是对于printStrA,每次调用的结果都是一样的,而printStrB的结果会根据全局变量stringb的不同而不同。这一点值得以后的研究。

关于闭包(closures),PIL上有一个很有意思的例子,我做了一些扩展。

local x = function ()
    local i = 0
    print "aaa"
    local function x2()
        i = i + 1
        print "bbb"
        return i
    end
    return x2 — 这个地方不能是return x2(),否则返回的就是值而不是函数
end

x()
print "======="
x()
print "======="

local c = x()
print "======="
print(c())
print "======="
print(c())
print "======="
print(c())
print "======="

local c = x()
print "======="
print(c())

结果会是什么呢?

首先,很有意思的一点是,对于返回正确函数尾调用,一种情况下,return function()后面的代码不会运行,就是说当x()时,以及当local c=x()的时候。

我们如果想达到计数器的效果,一定要用local c=x(),然后反复调用c(),而不是调用x()。原因就是c实际上指向了x返回的匿名函数,这样每次运行c,实际上运行的就是那个匿名函数。另外一个有趣的结论是,对于返回正确尾调用的函数,尾调用实际上还没有运行。

运行的结果就是下面这样,你猜对了么?

aaa
=======
aaa
=======
aaa
=======
bbb
1
=======
bbb
2
=======
bbb
3
=======
aaa
=======
bbb
1

关于尾调用, return g(x)是尾调用,而return (g(x))就不是,原因是return (Fun()) — This expression is a single function call surrounded in parentheses, which is different than the required single function call (the parentheses adjust Fun to one return value).

0
0
分享到:
评论

相关推荐

    lua调用c函数库的demo

    lua调用c函数库的demo 其中实现了对一个 数组的管理。 注意lua参数与c函数的对应, 如:b=lua_dllb.getarray(a,1) static int getarray(lua_State* L) { NumArray * a=(NumArray*)lua_touserdata(L,1); //对应lua...

    Lua编程事例:调用Lua有参函数

    这次说明的了,在VC++ 6.0中怎么样调用一个lua脚本中的有参函数。

    lua调用C++函数

    本人亲自编译通过的程序,如果无法通过只可能是您的编译环境有问题。本人的开发环境:VC++6.0,使用的是Win32 Console Application

    Lua调用C++函数实现

    NULL 博文链接:https://pirateyk.iteye.com/blog/513811

    Lua的使用入门之在C++程序中调用lua函数1

    基本的调用lua变量与函数,实现文本的获取与显示策略,若要改变显示方式,只要修改move()函数即可.

    Lua的最基本使用 C++与lua的互相调用

    C++调用Lua函数 以及Lua调用C++函数

    Lua中调用C函数

    在Linux底下,从Lua中调用C函数的一个简单例子。

    tolua++ 版helloworld (lua脚本调用C++类的成员函数方法)

    关于tolua++的资料太少,这个通过实例让你知道如何通过tolua++和C++交互,简单明了。 通过5个文件来演示这个tolua++版 hello world hello.lua ,hello.h ,hello.pkg ,...这个程序实现了脚本调用C++类的成员函数方法

    windows 下使用 Lua 绘制正弦函数

    Programming in lua 艺一书中第6章再论函数,写了一个lua 实现绘制正弦函数的例子,但最后却说,“要想让这个例子正确的运行,你必须调整你的终端类型和代码中的控制符一致”,网上查了一下,意思就是这段代码linux...

    串口屏LUA例程-常用的回调函数使用说明V1.0.pdf

    串口屏LUA例程-常用的回调函数使用说明V1.0.pdf(本文将介绍大彩LUA脚本API函数中的回调函数使用方法,以及调用回调函数的注意事项。)

    lua参考手册和lua常用函数

    lua参考手册和lua常用函数,学习lua很有帮助的资料,希望对大家有用

    基于串口屏LUA脚本—-绘图API函数功能V1.0.pdf

    本文将介绍大彩 LUA 脚本 API 函数中的绘图 API 函数使用方法,以及使用函数的注意事项。

    Lua 类的继承与函数override

    Lua中没有类的概念,但是程序猿说要面向对象,然后就有类。程序猿说要继承 和override,然后就有了继承 和 override 。

    Lua UnPack函数用法实例

    主要介绍了Lua UnPack函数用法实例,unpack它接受一个数组(table)作为参数,并默认从下标1开始返回数组的所有元素,需要的朋友可以参考下

    Luanet(0.01) Lua与.net接口函数库

    Luanet(0.01) Lua与.net接口函数库 Luanet(0.01) Lua与.net接口函数库 Luanet(0.01) Lua与.net接口函数库

    Lua所有内置函数罗列

    主要介绍了Lua所有内置函数罗列,本文汇集了Lua脚本语言的所有内置函数,需要的朋友可以参考下

    lua5.3实例

    5. e12.lua e13.cpp ## c++调用 lua函数 6. e14.cpp e15.lua ## lua调用c++函数 7. 文件夹class ## lua调用c++类 堆栈形式 8 文件夹student ## lua调用c++类, table形式 build: works/lua_demo$ ./build.sh e13....

    LUA_函数库

    lua脚本语言的函数库。便于程序员查询。方便大家。

    常用lua函数

    常用lua函数,代码写的非常规范,强力推荐!

    易语言LUA支持库1.0#0版(第三方)

    LUA脚本支持库 (1.0#0版)是对LUA5.1.4的封装,包含了 “LUA”数据类型,LUA函数操作函数等。下面对易语言中使用LUA做一个简单的介绍。LUAC函数操作(命令分类)。这是一组全局函数,当您在您的应用程序中实现一个...

Global site tag (gtag.js) - Google Analytics