Lua详解http://www.runoob.com/lua/lua-metatables.html
Lua:轻量级脚本语言,不需要编译,直接运行,所有脚本语言都有这个特点
执行lua方式:(交互式编程,脚本式编程)
Lua文件是.lua后缀的
Lua语句相对C#等编译语言比较随意,语句末不用写分号也可以写分号
注释方法:单行注释:- / 多行注释:--[[ ......... ]]-- 或 --[[ ....--]] 或 --[[ ...]]
变量:
Lua不需要写变量类型 ==> 变量名 = 值
Lua区分大小写
变量存储什么类型数据就是什么类型 类似于 var
使用type来获取变量的类型
Lua数据类型:
Number:小数类型(Lua没整型和浮点的区分)
boolean:布尔类型 (Lua里把false和nil看作是假,其他都是真)
nil:表示空数据,相当于null,对于未定义的变量,输出的结果都是nil
string:字符串类型,可以使用双引号表示,也可以使用单引号表示,还可以用[[...]]表示
字符串在处理数学运算时,会尝试转Number去计算,如果转换不成功就报错
使用(..)来连接字符串
使用#来计算字符串长度,例如:(print(#"hehe")) -- 4
table:table表示一个数组的时候,默认索引是从1开始的
table = {} ==>创建一个空表
table = {"string",true,1,nil} ==>创建表并赋值
访问table表 ==> print(table[1])
修改table表 ==>table[1]=66; print(table[1])
table表表示数组的时候 ==> table.insert(table,"hehe")==>第一个参数为表变量名,第二餐数为插入内容,方法为依次向后找,只要找到一个nil的位置就把内容插入进去
table.insert(table,66,"hehe") ==>第二个参数为插入位置,可以跳越性插入
table.insert(table,2,"hehe") ==> 从第二个位置元素开始,插入,后面元素依次后移
table表表示数组的时候的删除 ==> t = {1,2,"hehe",true} ==> table.remove(t,1) ==>删除指定索引位置元素,后面元素依次前移
table.remove(t) ==> 删除连续索引的最后一个元素
table是一个关联数组,索引可以是数字也可以是字符串
例如:t = {[2] = 10,1,2,3,5,[3]=10,[-1]=20,["hehe"] = "lol",key = "hh",c = {1,3}}
print(t[2]) print(t["hehe"]) print(t.hehe) print(t["key"]) print(t.key) print(t.c[2])
添加字符串为索引的元素
t["key1"] = "hh1" t.key2 = "hehe2" print(t.key1) print(t["key2"]) i = "key2" print(t[d])
Lua运算符
数学运算符: + - * / % ^ (没有自增自减类型的运算符)
关系运算符:== >= > < <= ~=(不等于)
逻辑运算符:and or not
条件语句
if a then
...
end
------------------------
if a then
...
else
...
end
------------------------
if a then
...
elseif b then //注意elseif没有空格
...
else
...
end
循环语句
a = 1
while a < 10 do
...
a = a+1
end
---------------------------------
repeat
...
a = a+1
until a>10 //until 的条件满足,跳出循环
----------------------------------
for a = 1, 10, 3 do //for 变量定义,条件,每次循环累加值 do 循环体 end
...
end
循环有break关键字跳出,没有continue关键字
局部变量和全局变量
一般情况下,定义的变量都是全局的变量,前面加local关键字就是局部变量 ==> local t = {1,2,3,true,"key" = "value"}
在lua table中 通过key 来访问 value值 当需要对以table为单位进行操作如+ - 等操作时,就需要涉及到元表的应用
而处理这种表的相加等操作的方法叫做 “元方法”
处理元表:
setmetatable(table,metatable) ==> 对指定table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable会失败
getmetatable(table) ==>返回对象的元表(metatable)
对指定表设置元表:
myTable = {}
myMetatable = {}
setmetatable(myTable,myMetatable) ==> 把myMetatable设为myTable的元表
getmetatable(myTable) ==>返回myMetatable
元方法 相当于重写
__index ==>可以把方法或表数据放入__index中
例如:
t = {1,2}
print(t["hehe"]) --> nil
t = setmetatable({},{__index = {"hehe"=3}})
print(t["hehe"]) --> 3
t = {1,2,3}
func = function(t,key)
if key = "hehe" then
return "lol"
else return nil
end
end
t = setmetatable({},{__index = func})
print(t.hehe) --> lol
rawset : 防止不断执行__newindex陷入死循环(例:rawset(table,"key","hehe"))
rawget:跳过__index函数,只从原来表中搜索(print(rawget(t,t.key)))
常用元方法还包括
__add\__sub\__mul\__div\__mod\__eq\__It\__le\_call\_tostring
迭代器:
for k,v in pairs(table) do
...
end
------------------------------
for k,v in ipairs(table) do //顺序输出元素v
...
end