• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua中的closure、泛型for

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

【1】closure就是一个函数加上该函数所需访问的所有的“非局部的变量”

看下面一个例子:

function newCounter()

  i = 0

  return function()

    i = i + 1

    return i

  end

end

c1 = newCounter()
print(c1())
print(c1())

result:
1
2

 用newCounter创建了一个函数,函数执行了(i=i+1 return i),调用一次c1,就执行一次该函数体,第一次打印出1。这个就是closure的作用,它保存了“i”这个非局部变量,每次只执行c1(),就使其加1。如果再有语句c2 = newCounter(),print(c2())将会得到1,c2中的i和c1中的i互不影响。

【2】泛型for的语义

泛型for的语法如下:

for <var-list> in <exp-list> do

  <body>

end

它的执行顺序为:

1、对in后面的表达式<exp-list>求值,得到三个值给for保存:迭代器函数、恒定状态和控制变量的值(控制变量为<var-list>中的第一个变量)

2、以恒定状态和控制变量调用迭代器函数,然后将迭代器函数的返回值赋予变量列表<var-list>中的变量

3、如果第一个返回值为nil,那么终止循环;否则重复2

来看一个例子:

--迭代器函数
local function iter(a, i)
    i = i + 1
    local v = a[i]
    if v then return i,v end
end
--表达式列表<exp-list>
function ipairs(a)
    return iter, a, 0
end

a = {"one", "two", "three"}
for i,v in ipairs(a) do
    print(i, v)
end

1、对表达式求值,得到iter(迭代器函数),a(恒定状态),0(控制变量初值)

2、执行iter(a,0),将其返回值赋值给<var-list>,那么for中的i等于1,v等于“one”。

3、因为第一个返回值不为nil,用恒定状态(a)和控制变量(1)调用迭代器函数(iter),即iter(a,1),得到i=2,v="two",如此循环,直至i=nil


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[转]Skynet之斗转星移-将控制权交给Lua发布时间:2022-07-22
下一篇:
Lua中的元表和元方法发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap