[转帖]lua-book-函数

lua,book,函数 · 浏览次数 : 0

小编点评

**函数定义格式:** ```lua function function_name (arc) -- arc 表示参数列表,函数的参数列表可以为空 -- bodyend 支持使用local定义为局部作用域的函数 ``` **函数参数支持:** * 固定参数:定义在函数定义中 * 变长参数:使用 `...` 来定义 **固定参数:** 固定参数是指在函数定义中定义的参数,无论调用该函数的次数,它们都会保持其值。 **变长参数:** 变长参数是指使用 `...` 来定义的参数,其数量可变。当调用该函数时,实参将根据实际参数的数量来分配。 **返回值:** 函数可以返回多个值,使用 `,”` 隔开。 **例子:** ```lua function swap(a, b) \treturn b, a -- 按相反顺序返回变量的值end print(swap(1,2)) -- 输出:2\t1 ``` **其他信息:** * 每个函数只能定义一个参数。 * 函数的参数可以是引用。 * 可以在函数定义中使用 `_` 命名虚变量。 * 虚变量只在函数内部可见。

正文

http://me.52fhy.com/lua-book/chapter5.html

 


在 Lua 中,函数 也是一种数据类型,函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。

函数定义

函数定义格式:

function function_name (arc) -- arc 表示参数列表,函数的参数列表可以为空
	-- body
end

支持使用local定义为局部作用域的函数。

由于函数定义本质上就是变量赋值,而变量的定义总是应放置在变量使用之前,所以函数的定义也需要放置在函数调用之前。

由于函数定义等价于变量赋值,我们也可以把函数名替换为某个 Lua 表的某个字段,例如:

function foo.bar(a, b, c)
	-- body ...
end

对于此种形式的函数定义,不能再使用 local 修饰符了,因为不存在定义新的局部变量了。

函数参数

支持固定参数和变长参数。固定参数很好理解,变长参数则是使用...定义的:

function function_name (...)
	local args = {...} or {} 
end

注意:在调用函数的时候,如果实参和形参个数不一样的时候:

  • 实参缺少,则使用nil代替
  • 实参大于形参,则忽略

LuaJIT 2 尚不能 JIT 编译这种变长参数的用法,只能解释执行。

Lua函数的参数大部分是按值传递的。值传递就是调用函数时,实参把它的值通过赋值运算传递给形参,然后形参的改变和实参就没有关系了。

当函数参数是 table 类型时,传递进来的是实际参数的引用,此时在函数内部对该 table 所做的修改,会直接对调用者所传递的实际参数生效。

函数返回值

Lua可以返回多个值,这点和Python、Go类似,不同于C、PHP等语言。返回多个值时,值之间用“,”隔开。

local function swap(a, b) 
	return b, a -- 按相反顺序返回变量的值
end
print(swap(1,2))

输出:

2	1

注意:在调用函数的时候,如果返回值的个数和接收返回值的变量的个数不一致时:

  • 返回值缺少,则使用nil代替
  • 返回值个数大于接收变量的个数,则忽略

当一个方法返回多个值时,有些返回值有时候用不到,要是声明很多变量来一一接收,显然不太合适 。Lua 提供了一个虚变量(dummy variable),以单个下划线(“_”) 来命名,用它来丢弃不需要的数值,仅仅起到占位的作用。这点和Go用法一致。

local function test_var()
	return 1,2,3
end

local x,_,y = test_var()
print(x,y) -- 1	3

函数动态调用

函数动态调用是指:调用回调函数,并把一个数组参数作为回调函数的参数。

主要用到了unpack函数和可变参数。

示例:

function do_action(func, ...)
	local args = {...} or {} -- 防止为nil
	func(unpack(args, 1, table.maxn(args))) -- 如果实参中确定没有nil空洞(nil值被夹在非空值之间),可以只写第一个参数 
end

local function add(x, y)
	print(x+y)
end

local function add2(x, y, z)
	print(x+y+z)
end

do_action(add, 1, 1)
do_action(add2, 1, 1, 1)

输出:

2
3

unpack 内建函数还不能为 LuaJIT 所 JIT 编译,因此这种用法总是会被解释执行。

与[转帖]lua-book-函数相似的内容:

[转帖]lua-book-函数

http://me.52fhy.com/lua-book/chapter5.html 在 Lua 中,函数 也是一种数据类型,函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。 函数定义 函数定义格式: function function_name (arc) -- ar

[转帖]lua-book-模块

http://me.52fhy.com/lua-book/chapter6.html 模块 从Lua5.1开始,Lua添加了对模块和包的支持。 Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个table,然后把需要导出的常量、函数放入其中,最后返回这个

[转帖]lua-book

http://me.52fhy.com/lua-book/chapter2.html 数据类型 [TOC] @date: 2018-3-18 Lua中有8个基本类型分别为:nil、boolean、number、string、table、function、userdata、thread。 函数 typ

[转帖]lua-book-运算符

http://me.52fhy.com/lua-book/chapter3.html Lua支持下列主要的运算符: 算术运算符 关系运算符 逻辑运算符 赋值运算符 还支持..、#特殊运算符。其中赋值运算符仅支持=,不支持C语言的+=、++等运算符。 算术运算符 + 加法 - 减法或者负号 * 乘法

[转帖]lua-book-控制语句

http://me.52fhy.com/lua-book/chapter4.html Lua 语言提供的控制结构有 if-else,while,repeat,for,并提供 break、return 关键字来满足更丰富的需求。不支持switch、continue。 Lua 提供的控制语句部分特征类似

[转帖]lua-book-常用库介绍

http://me.52fhy.com/lua-book/chapter7.html String 库 .. 链接两个字符串 string.upper(argument) 字符串全部转为大写字母。 string.lower(argument) 字符串全部转为小写字母。 string.len(arg)

[转帖]lua-book-文件操作

http://me.52fhy.com/lua-book/chapter8.html Lua I/O 库用于读取和处理文件。分为简单模式、完全模式。 简单模式(simple model) 拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。 完全模式(complete model

[转帖]lua-book-元表

http://me.52fhy.com/lua-book/chapter9.html 在Lua5.1语言中,元表 (metatable) 的表现行为类似于 C++ 语言中的操作符重载,类似PHP的魔术方法。Python里也有元类(metaclass)一说。 通过元表,Lua有了更多的扩展特性。Lua

[转帖]Ngx_lua

http://me.52fhy.com/lua-book/chapter12.html 简介 ngx_lua 指的是 lua-nginx-module模块:通过将 LuaJIT 的虚拟机嵌入到 Nginx 的 worker 中,这样既保持高性能,又能不失去lua开发的简单特性。 OpenResty 

[转帖]Redis里使用Lua

http://me.52fhy.com/lua-book/chapter11.html 版本:自2.6.0起可用。 时间复杂度:取决于执行的脚本。 使用Lua脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。 原子操作。redis会将整个脚本作为一个整体执行,中间不会被