Lua的基础
环境安装
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install
函数
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
- optional_function_scope:该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字本地。
- result_params_comma_separated:函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
多返回值
function doublereturn()
return 1,2
end
local a,b = doublereturn()
print(a,b)
~ 1,2
可变参数
function add(...)
local sum = 0
local arg = {...} --将参数赋予局部变量arg
for i,v in pairs(arg) do
sum = sum + v
end
return sum
end
- 可通过select('#',...)返回可变参数的长度:对于i = 1,选择('#',...)做
- select(n,...)用于访问n到select('#',...)的参数:local arg = select(i,...)
运算符
常见运算符不举例了,有个需要注意的地方是Lua的数字都是按照双进行操作,所以不会像cpp那样整数除法省略小数,如果需要省略小数的话用t1,t2 = math.modf(x / Y);第一参数返回整数部分,第二个参数返回小数部分
符运算优先级从高到低
^
not - (负数)
* /
+ -
..
< > <= >= ~= ==
and
or
迭代器
无状态迭代器ipairs
for key,value in ipairs(array)
do
print(key, value)
end
- 首先,初始化,计算在后面表达式的值,表达式应返回泛型为需要的三个值:迭代函数,状态常量,控制变量;与多值赋值一样,如果表达式返回的结果个数不足三个会自动用零补足,多出部分会被忽略。
- 第二,将状态常量和控制变量作为参数调用迭代函数(注意:对于用于结构来说,状态常量没有用处,仅仅在初始化时获取他的值并传递给迭代函数)。
- 第三,将迭代函数返回的值赋给变量列表。
- 第四,如果返回的第一个值为零循环结束,否则执行循环体。
- 第五,回到第二步再次调用迭代函数
多状态迭代器
很多情况下,迭代器需要保存多个状态信息而不是简单的状态常量和控制变量,最简单的方法是使用闭包,还有一种方法就是将所有的状态信息封装到表内,将表作为迭代器的状态常量,因为这种情况下可以将所有的信息存放在表内,所以迭代函数通常不需要第二个参数。
表
内存处理
设置一个表a并且初始化,这时再设置一个表b将赋值给b,此时a与b都指向同一个内存,相当于指针,如果通过a修改该内存的数据,b同时也会生效。当把一个制为零后,b同样可以访问该内存,而当把b也制为零后,Lua中的内存回收机制会判断该内存已经没有引用从而清理相对应的内存
元表
通过修改元方法来实现两个表之间的操作
- setmetatable(table,metatable):对指定表设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable会失败
- getmetatable(table):返回对象的元表(metatable)
__index元方法
tableA = setmetable({key1 = "value1"}, {
__index = function(tableA, key)
if key = "key2" then
return "metatablevalue"
else
return nil
end
end
})
- tableA表赋值为{key1 =“value1”}
- tableA设置了元表,元方法为__index。
- 在tableA表中查找key1,如果找到,返回该元素,找不到则继续。
- 在tableA表中查找key2,如果找到,返回metatablevalue,找不到则继续
- 判断元表有没有
__
索引方法,如果__index方法是一个函数,则调用该函数。 - 元方法中查看是否传入“key2”键的参数(tableA .key2已设置),如果传入“key2”参数返回“metatablevalue”,否则返回tableA对应的键值
__newindex元方法
当你给表的一个缺少的索引赋值,解释器就会查找__newindex元方法:如果存在则调用这个函数而不进行赋值操作
比如
mymetatable = {}
MYTABLE = setmetatable({键1 =“VALUE1”},{__newindex = mymetatable})
mytable.newkey =“value2”
这时因为调用了一个mytable的没有的索引,所以他不会进行赋值,而是通过newindex找到mymetatable,并对mymetatable.newkey进行赋值
操作符
模式 | 描述 |
---|---|
__加 | + |
__sub | - |
__mul | * |
__div | / |
__mod | % |
__unm | - (负数) |
__concat | ..(拼接) |
__eq | == |
__lt | < |
__le | <= |
文件I / O
file = io.open (filename [, mode])
- io.read()
- io.tmpfile():返回一个临时文件句柄,该文件以更新模式打开,程序结束时自动删除
- io.type(file):检测obj是否一个可用的文件句柄
- io.flush():刷新缓冲区
- io.lines(可选文件名):返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,但不关闭文件
PS:案例摘自菜鸟教程