Lua程序设计 深入函数01

在Lua中,函数是一种“第一类值”:表示在Lua中的函数与其他传统类型的值(例如:数字和字符串)是一样的,可以存储到变量(全局,局部均可)或table中,可以作为实参传递给其他函数,还可以作为其他函数的返回值。

“词法域”:指一个函数可以嵌套在另一个函数中,内部的函数可以访问外部函数中的变量。

Lua中的函数与所有其他值一样都是匿名的,当讨论一个函数时,实际上是在讨论一个持有某函数的变量。这与变量持有各种值一个道理,可以以多种方式来操作这些变量。

a = {p = print}
a.p("Hello World")  --->Hello World
print = math.sin   --->print现在引用了正弦函数。
a.p(print(1))   ---->0.841470
sin = a.p       --->sin 现在引用了print函数。
sin(10,20)    ---->10   20

Lua中的函数可以理解成由一些表达式创建的,因此一个函数的定义实际就是一条赋值语句,这条语句创建了一种类型为“函数”的值,并将这个值赋予一个变量。

function foo(x)  return 2*x end  ======>  foo = function(x) return 2*x end 
可以将表达式“function(x) <body> end”视为一种函数的构造式,就像table的构造式{}一样。将这种函数构造式的结果视为一个“匿名函数”。

可接受另一个函数作为实参的,称其是一个“高阶函数”。应用匿名函数来创建高阶函数所需的实参则可以带来更大的灵活性。

function derivative (f, delta)
  delta = delta or le - 4
  return  function(x)
          return (f(x + delta) - f(x)) / delta
         end
 end        对于特定的函数f调用derivative(f)将返回其导数。

Lua程序设计 深入函数01,布布扣,bubuko.com

时间: 2024-10-13 21:14:54

Lua程序设计 深入函数01的相关文章

Lua程序设计 函数 正确的尾调用

Lua中的"尾调用"就是一种类似于goto的函数调用,当一个函数调用是另一个函数的最后一个动作时,该调用才算是一条"尾调用".[一个函数在调用完另一个函数之后,是否就无其他事情需要做了] function f(x) return g(x) end   也就是说,当f调用完g之后,f所代表的整个函数的调用才算执行完成也就无其他事情可做了.因此,这种情况中,程序就不需要返回那个"尾调用"所在的函数了. 所以在"尾调用"之后,程序也

Lua程序设计 非全局的函数

由于函数是一种"第一类值",因此一个显而易见的推论就是,函数不仅可以存储在全局变量中,还可以存储在table的字段和局部变量中. 大部分Lua库也采用了这种将函数存储在字段中的机制(io.read.math.sin).若要在Lua中创建这种函数,只需将常规的函数语法与table语法结合起来使用即可: lib = {} lib.foo = function(x,y) return x + y end  lib.goo = function(x,y) return x - y end 也可

Lua程序设计 closure(闭合函数)

若将一个函数写在另一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特征称之为"词法域". 假设有一个学生姓名的列表和一个对应于每个姓名的年级列表,需要根据每个学生的年纪来对他们的姓名进行排序. names = {"Peter", "Paul", "Mary"} grades = {Mary = 10, Paul = 7, Peter = 8} table.sort(names, function(n1,

《lua程序设计 第二版》 学习笔记6 -------- 深入函数

-- 第6章 深入函数 -- 函数是一种"第一类值",他们具有特定的"词法域" -- "第一类值":与其他传统类型的值具有相同的权利.例如:存储到变量/table中,作为实参传递给函数或者作为其他函数的返回值 -- "词法域":一个函数可以嵌套在另一个函数中,内部函数可以反问外部函数的变量. local function testFun(x) return 2 * x end -- 函数定义方式1 local testFun

Lua程序设计 泛型for的定义

泛型for在循环过程内部保存了迭代器函数.实际上他保存着3个值:一个迭代器函数.一个恒定状态和一个控制变量. 泛型for的语法如下:   for <var-list> in <exp-list>  do   end  其中,<var-list>是一个或多个变量名的列表,以逗号分隔:<exp-list>是一个或多个表达式的列表,同样以逗号分隔.通常表达式列表只有一个元素,即一句迭代器工厂的调用.    for k, v in pairs(t) do print

Lua程序设计(第二版)学习笔记(一)

前段时间认真的看了一下<lua程序设计(第二版)>这本书,每一章写一个lua脚本,诸多注释,相信给初学者有一定帮助. -- 第一章代码 print("hello Hello"); -- 全局函数 function face(n) if n == 0 then return 1 else return n + face(n - 1) end end print(face(100)); -- 1.1 程序快(chunk) -- 每段代码,源代码文件或者交互模式 的 一行 代码,

《lua程序设计(第二版)》学习笔记(五)

-- 第 5 章 函数 -- 一种对语句和表达式进行抽象的主要机制 print(os.date()); -- 打印日期 Sun Apr 20 12:44:46 2014 -- 一看到sun,感慨广州没有晴天 -- 函数没有参数也要括号 -- 特殊情况:只有一个参数的时候, 并且参数一个string/table构造式,可不写括号 print "Hello world" -- dofile "chapter03.lua" -- 冒号操作符:为面向对象式的调用而提供的函数

lua程序设计之协同程序

本文的内容主要来自于<lua程序设计>一书,部分内容来自网络 一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停. 一 协同程序基础 -协同程序的函数放在"coroutine"的table中 -状态status -suspended 初始状态(创建时) -running -    dead -normal:当协程A唤醒协程B,A就处于normal状态 -coroutine函数 -coroutine.cr

Lua程序设计 迭代器与closure

所谓"迭代器"就是一种可以遍历一种集合中所有元素的机制.在Lua中,通常将迭代器表示为函数.每调用一次函数,即返回集合中的"下一个"元素. 每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置及如何步进到下一个位置.在Lua中,closure对于这类任务提供了极佳的支持,一个closure就是一种可以访问其外部嵌套环境中的局部变量的函数.对于closure而言,这些变量就可用于在成功调用之间保持状态值,从而使closure可以记住它在一次遍历中所