首页 > 代码库 > lua 学习笔记(1)

lua 学习笔记(1)

一、closure
一个closure就是一种可以访问其外部嵌套环境中的局部变量的函数,对与closure而言,这些变量就可以用于在成功调用之间保持状态值,从而使closure可以记住他在一次遍历中所在的位置。为了创建一个closure,必须创建closure所用到的“非局部变量”,因此一个closure结构通常涉及到两个函数:closure本身和一个用于创建该closure的工厂函数。eg:
 
function values(t)
  local i = 0
  return function()
    i = i + 1
    return t[i]
  end
end
 
t = {10, 20, 30}
for element in values(t)
do
  print(element)
end
local iterator
function allwords()
  local state = {line = io.read(), pos = 1}
  return iterator, state
end

function iterator(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
end

 

注:有关closure和“非局部变量”依然需要搞清楚
 
二、尾调用
一个函数调用是另一个函数的最后一个语句的时候,通常情况下是作为return语句返回的函数调用 eg:function f(x) return g(x) end, 这个函数中的g(x)属于尾调用,符合尾调用的格式为 return <func>(para) 。在尾调用的情况下,被调函数执行完就不用返回调用者的函数栈,也就是讲在进行尾调用的时候,调用者的函数栈就可以释放掉了,这对于那些需要进行递归调用的场景非常契合。eg:function f(x) g(x) end 这个函数中的g(x)不属于尾调用。
 
注:1、部分内容引自《Lua 程序设计》  2、参考 http://www.cnblogs.com/Kelvinshere/archive/2012/09/10/closure.html

lua 学习笔记(1)