第6章 深入函数

函数是一种“第一类值(First-Class Value)”,他们具有特定的词法域(lexical scoping)

将表达式“function(x) <body> end”视为一种函数的构造式,就像table的构造式{}一样。

function foo(x) return 2*x end  --> foo = funciton(x) return 2*x end

closure(闭包)

非局部变量(non-local variable)

从技术上讲,lua只有closure,而不存在“函数”,函数本身就是一种特殊的closure.

经典示例:

do

local oldOpen = io.open

local access_OK = function(filename, mode)

<检查访问权限>

end

io.open = function(filename, mode)

if access_OK(filename, mode) then

return oldOpen(filename, mode)

else

return nil, "access denied"

end

end

end

非全局的函数

Lua把chunk当前函数处理,在chunk内可以声明局部函数(仅仅在chunk内可见),词法定界保证了包内的其他函数可以调用此函数。

使用前先声明

local fact
local fact = function (n)
  if n == 0 then
    return 1
  else
    return n * fact(n-1)
  end
end

在定义非直接递归局部函数时要先声明然后定义才可以。

尾调用,其是一种类似在函数结尾的goto调用,当函数最后一个动作是调用另外一个函数时,我们称这种调用尾调用。如:

function f(x)  return g(x)  end

尾调用之后程序需要在栈中保留关于调用者的任何信息,lua利用这种特性在处理尾调用时不使用额外的栈。 所以尾调用的层次可以无限制。

第七章 迭代器和泛型for

迭代器与闭包

迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里。闭包提供的机制可以很容易实现这个任务。

function list_iter (t)
  local i = 0
  local n = table.getn(t)
  return function ()
    i = i + 1
    if i <= n then return t[i] end
  end --返回闭包
end

泛型for的语义

for var1, var2, ... varN in explist do block end

与下面等价
do
  local _f, _s, _var = explist  -- 迭代函数、状态变量、控制变量
  while true do
    local var1, var2, ..., varN = _f(_s, _var)
    _var = var1
    if _var == nil then break end
    block
  end
end

无状态的迭代器

类似ipairs、pairs实现:

local function iter(a, i)
  i = i + 1
  local v = a[i]
  if v then
    return i, v
  end
end

function ipairs(t)
  return iter, t, 0
end

function pairs(t)
  return next, t, nil
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

Lua编程入门-学习笔记2的更多相关文章

  1. Lua编程入门-学习笔记1

    第1章:起点 Chunks: 语句块 每个语句结尾的分号是可选的,如果同一行有多个语句最好使用分号分隔: dofile("lib1.lua")  -- 执行lua文件 全局变量:局 ...

  2. opencv3 编程入门学习笔记(一): 基本函数介绍

    滤波 blur (均值滤波) 均值滤波是典型的线性滤波算法, 主要方法为领域平均法(即用一片图像区域的各个像素的平均值来代替原图像中的各个像素值) 缺点: 不能很好的保护图像细节, 在图像去噪的同时也 ...

  3. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  4. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

  5. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  6. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...

  7. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  8. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  9. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

随机推荐

  1. tableView特色用法

    // //  ViewController.m //  UITableView // //  Created by yhj on 15/12/15. //  Copyright © 2015年 QQ: ...

  2. 【.Net Remoting-1】

    [.NetRemoting]2015.09.16 [分布式应用程序] 应用程序分布在不同计算机上,通过网络来共同完成一项任务 C/S架构[模式] [互操作性,Interoperability]又称[互 ...

  3. leetcode_最长公共前缀

    题目:Write a function to find the longest common prefix string amongst an array of strings. 题解:给出的函数为: ...

  4. python调用ice接口

    今天用python调用ice接口,遇到如下提示 ImportError: No module named Ice 解决方案是 set PYTHONPATH=C:\Program Files\ZeroC ...

  5. [Leetcode] Longest Substring Without Repeating Characters (C++)

    题目: Given a string, find the length of the longest substring without repeating characters. For examp ...

  6. chmod 命令——chmod 755与chmod 4755区别(转)

    755和4755的区别 chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限. 一般是三个数字:第一个数字表示文件所有者的权限第二个数字表示与文件所有者同属一个用户组的其他 ...

  7. 在JS中调用JAVA变量

    在JS中调用JAVA变量可以,方法是:var JS变量名 = “<%=JAVA变量名 %>”<%中间写java代码,跟在JSP中一样%>在JAVA中 ,无法调用JS变量

  8. js前台获取list的demo

    后台 bannerlist=homePageService.searchBanner(bannerVO); // 注意这里的Gson的构建方式为GsonBuilder,区别于test1中的Gson g ...

  9. WPF笔记(2.2 DockPanel)——Layout

    原文:WPF笔记(2.2 DockPanel)--Layout 读完了这一节,发现DockPanel就是过去winform中的Dock属性.原来的Dock属性是子控件设置,而其父亲级别不用设置.现在W ...

  10. cf478C Table Decorations

    C. Table Decorations time limit per test 1 second memory limit per test 256 megabytes input standard ...