lua中函数简介

在lua中,函数是一种第一类值,它们具有特定的词法域。

第一类值表示在lua中函数与其他传统类型的值具有相同的权利。函数可以存储在变量中,全局变量或者拒不变量或者table中,可以作为实参传递给其他函数,还可以作为其他函数的返回值。

词法域是什么意思呢,这是指一个函数可以嵌套在另一个函数中。内部的函数可以访问外部函数中的变量。接下来就会看到,这项听似平凡的特性将给语言带来极大的能力。因为它允许在Lua中应用各种函数式语言中的强大编程技术。

在lua中有一个容易混淆的概念是,函数与所有其他值一样都是匿名的,即它们都没有名称。当讨论一个函数名时候,实际上是在讨论一个持有某函数的变量。这与其他变量持有各种值一个道理,可以以多种方式来操作这些变量。

a = {p = print}

a.p("Hello World")

print = math.sin

a.p(print(1))

sin = a.p

sin(10,20)

如果说函数式值得话,那是否可以说函数就是由一些表达式创建的呢,是的,事实上,在lua中最常见的是函数编写方式,例如:

function foo(x)

return 2*x

end

只是一种所谓的语法糖而已,也就是说,这只是以下代码的一种简化书写形式:

foo = function(x)

return 2*x

end

network = {

{name = "grauna",IP="210.26.30.34"},

{name="arraial",IP="210.26.30.23"},

{name ="lua",IP="210.26.23.12"},

{name = "derain",IP="210.26.23.20"},

}

table.sort(network,function(a,b) return (a.name>b.name) end)

像sort这样的函数,接受另一个函数作为实参,称其是一个高阶函数,高阶函数式一种强大的编程机制,应用匿名函数来创建高阶函数所需的实参则可以带来更大的灵活性。但请记住,高阶函数并没有什么特权。lua强调将函数视为第一类值,所以高阶函数只是一种居于该观点的应用体现而已。

为了进一步演示高阶函数的应用,将再写一个关于导数的高阶函数。在一个非形式化定义中,一个函数f在点x的导数就是(f(x+delta)-f(x))/delta,其中d趋向于无限小,可以用如下方式近似地计算这个函数f的导数:

function derivative(f,delta)

delta = delta or 1e-4

return function(x)

return (f(x+delta)-f(x))/delta

end

end

对于特定的函数f调用derivative(f)将近似地返回其导数,例如:

c = derivative(math.sin)

print(math.cos(10),c(10))

由于函数在lua中式一种第一类值,所以不仅可以讲其存储在全局变量中,还可以存储在局部变量甚至table的字段中。接下来还将看到,将函数存储在table的字段中可以支持许多Lua的高级应用。例如模块和面向对象编程!

时间: 2024-10-30 03:55:18

lua中函数简介的相关文章

Lua中函数

1,lua中函数属于“第一类值”(与其他传统类型值具有相同的权利),函数可以存贮到变量或table中,可以作实参和其他函数返回值 2,函数与其他值一样都是匿名的,它们都没有名称,所谓的函数名实际上是一个持有某函数的变量 function foo (x) return 2*x     end 是这种方式的简写 foo = function (x)  return 2*x     end 3,closure(闭合函数) function newCounter() local i = 0 return

Lua中实现类似C语言的函数重载

Lua不支持像C那样的重载,例如,像下面这种形式在Lua中无法得到预期结果 1 function Add(a,b) 2 return a + b 3 end 4 5 function Add(a,b,c) 6 return a + b + c 7 end 但是,Lua中函数对于传入的参数个数也很宽松,它会自动去适应传入的参数,如果传入的参数个数多于定义的个数,则会自动忽略后面多于的参数,如果传入的参数个数少于定义的个数,则会将不足的参数用nil补齐.例如,上述希望实现的重载可以用下面的形式完成:

LUA table中函数的调用

1 lua中函数作为表中元素时有三种定义方式 采用':'来定义,实际上隐藏了一个形参的声明,这个形参会截获调用函数时的第一个实参并把它赋值给self 2 调用方式,点号和冒号 functb:hello1()functb.hello2() 总结起来就是带:号调用表的函数时,会把表赋值给self,这样函数体里面可以直接使用self访问表的数据

Lua中的closure(闭合函数)

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

lua的函数初识

学习到Lua的函数,觉得有必要记下来. 参考教程:Programming in Lua 函数可以以表达式或陈述语句出现,如下所示: print(8*9, 9/8) a = math.sin(3) + math.cos(10) 书写函数时有个小规则,如果函数只有一个参数,或者是一串字符,或者是一个表结构时,括号可以省略: print "Hello World" <--> print("Hello World") dofile 'a.lua' <--&

Lua中的模块(module)和包(package)详解1

这篇文章主要介绍了Lua中的模块(module)和包(package)详解,本文讲解了require函数.写一个模块.package.loaded.module函数等内容,需要的朋友可以参考下 前言 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个程序库,可以通过require来加载.然后便得到了一个全局变量,表示一个table.这个table就像是一个命

Lua语言基础汇总(11) -- Lua中的模块与包

前言 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个程序库,可以通过require来加载.然后便得到了一个全局变量,表示一个table.这个table就像是一个命名空间,其内容就是模块中导出的所有东西,比如函数和常量,一个符合规范的模块还应使require返回这个table.现在就来具体的总结一下require和module这两个函数. require函

Lua中的模块(module)和包(package)详解

这篇文章主要介绍了Lua中的模块(module)和包(package)详解,本文讲解了require函数.写一个模块.package.loaded.module函数等内容,需要的朋友可以参考下 前言 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个程序库,可以通过require来加载.然后便得到了一个全局变量,表示一个table.这个table就像是一个命

简述C/C++调用lua中实现的自定义函数

1.首先说下目的,为什么要这么做 ? 正式项目中,希望主程序尽量不做修改,于是使用C/C++完成功能的主干(即不需要经常变动的部分)用lua这类轻量级的解释性语言实现一些存在不确定性的功能逻辑:所以,程序功能如有问题,只需对lua脚本作出修改,而修改脚本的好处是简单高效,改完脚本后重新执行程序便能看到效果.  2.具体怎么做? 一般来说,C/C++调用lua接口或是数据交互,首先要做的是包含lua相关操作的头文件以及lua库相关的头文件,然后调用接口创建lua环境.用操作栈的规则和lua交互数据