在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
【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 |
请发表评论