闲扯LUA之二
来源:互联网 发布:php格式怎么转换 编辑:程序博客网 时间:2024/05/17 02:20
053当函数只有一个参数且这个参数是字符串或表构造的时候,用于表明是函数调用的()可以省略。例如:print("Hello world") <--> print "Hello world",type({1, 2, 3}) <--> type{1, 2, 3}。
·054Lua提供了面向对象方式调用函数的语法:o:fun(x) <--> o.fun(o, x)
·055Lua调用的函数可以是用其它语言编写的。
·056Lua函数的实参与形参与赋值语句类似,多余的部分被忽略,不足的部分用nil补充。
·057Lua函数可以返回多个值。例如:function size() return 100, 200 end。x = size(),则多余的200被丢弃。x, y, z = size(),则z被赋值为nil。如果print((size())),则size()被强制只返回一个值。
·058函数多值返回的特殊函数是unpack,它接受一个数组作为输入参数,返回数组中的所有元素。例如:a = {"hello", "world"} print(unpack(a)) 输出:hello world
·059Lua函数可以接受可变数目的参数,可变函数的参数列表使用...表示。接受到的参数被放在一个叫arg的表中,该表中还有一个名为n的域表示参数的个数。还可以在可变参数前加上固定参数(在C语言中要求可变函数必须包含固定参数,而Lua中固定部分是可选的)。
·060对于返回多值的函数,可以使用哑元(用下划线表示)跳过不需要的值。例如:函数fun返回1,2,3。如果只需要3,则:_, _, x = fun()
·061Lua的函数参数是和位置相关的,因此调用时实参会按顺序传递给形参。当参数比较多的时候,用名字指定参数的做法会更加有效。例如:
function window(option)
if option.size ~= "max" then
print("min")
elseif option.name ~= "min" then
print("name error")
end
end
调用示例:window{size = "max", name = "min"} <--> window{name = "min", size = "max"}。注意这里使用{}而不是()
·063Lua中的函数可以嵌套(C没有这种能力,Pascal可以),并且嵌套的函数可以访问外部函数中的变量。
·065在Lua中我们常这样书写函数:
function fun(x)
return 2 * x
end
实际上这是Lua语法的特例,原本的形式如下:
fun = function(x)
return 2 * x
end
函数的定义实际上是一个赋值语句,将类型为function的变量赋值给一个变量(类似C中将一个函数地址(使用函数名表示)赋值给一个函数指针)。
·066table标准库提供的sort排序函数接受一个表作为输入参数并且排序表中的元素。Lua采用给此函数提供一个函数变量的方式描述排序的依据(有点像C中的回调函数),而不是传入尽可能多的提供参数来描述。像sort这种接受其它函数作为参数的的函数在Lua中被称作高级函数(与普通函数没有什么本质上的区别,只是接受函数作为参数)。sort使用示例:
per = {{name = "abc", money = 1000, happy = 100}, {name = "bac", money = 999, happy = 101}, {name = "cab", money = 1999, happy = 60}}
table.sort(per, comfun)
table.sort(per, comfun)
·067当一个函数的内部嵌套另一个函数定义时,内部的函数可以访问外部函数的变量,这种特征在Lua中被称作词法定界。嵌套函数内出现的外部变量被称作外部的局部变量(或者叫upvalue)。
·068闭包是一个函数(内嵌于其它函数)和它的upvalue(外部函数的局部变量)。例如:
function counter()
local i = 0
return function() --匿名函数
i = i + 1
return i
end
c1 = counter() --注意这里是counter()而不是counter,counter()调用counter函数 --得到内嵌匿名函数的地址。
print(c1()) --得到1
print(c1()) --得到2
print(c1()) --得到3
c2 = counter() --创建一个新局部变量i,得到一个新的作用在此变量上的闭包。
print(c2()) --得到1
- 闲扯LUA之二
- 闲扯LUA之三
- 闲扯LUA之一
- 闲扯
- 闲扯
- 闲扯
- 闲扯
- 闲扯
- 闲扯
- 闲扯
- xml格式之DTD闲扯
- cocos2d-x 之闲扯UI制作
- 【COCOS2DX-LUA 脚本开发之二】LUA语言基础
- Lua 学习教程之android与lua相互调用(二)
- Lua学习笔记二之C中调用Lua
- 【COCOS2DX-LUA 脚本开发之二】LUA语言基础
- 【COCOS2DX-LUA 脚本开发之二】LUA语言基础
- 【Cocos2dx-Lua 脚本开发之二】Lua语言基础
- tiny6410: linux内核移植以及文件系统
- 动态规划小结
- 修复Linux引导(二):unknown filesystem,引导菜单无法启动系统,使用LiveCD修复
- 【DFS】Combinations
- Double Maze
- 闲扯LUA之二
- 《用java来解决大数问题总结》
- JavaScript关于闭包,匿名函数,this,对象等的一些理解
- Java实现FTP上传下载文件
- c++中 子类父类的构造函数调用顺序
- 字符串处理--HDU第1073解题报告
- mysql主从遇到问题
- linux命令系列之grep
- QtCreator使用时需要注意的一个地方。