zoukankan      html  css  js  c++  java
  • Lua中的closure、泛型for

    【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

  • 相关阅读:
    342. Power of Four(One-line)
    mysql的启动,停止与重启
    PHP学习笔记之interface关键字
    PHP学习笔记之析构函数以及static,self,parent关键字
    每天一个linux命令(1):ln 命令
    MySQL学习笔记:regexp正则表达式
    AARRR:数据运营模型
    MySQL学习笔记:从一个表update到另外一个表
    MySQL学习笔记:计算机服务中找不到MySQL服务
    MySQL学习笔记:insert into select
  • 原文地址:https://www.cnblogs.com/littlethank/p/2618340.html
Copyright © 2011-2022 走看看