1.loadfile dofile require 区别:
loadfile 只加载不编译(不运行代码)dofile (加载且编译) require加载且编译,检测加载编译一次后不再编译(只运行一次代码)
2.八大数据类型
nil boolean string function table unserdata thread number
3.闭包
外部函数+内部函数(内部函数应用外部函数的局部变量upvalue)例如 table.sort()
4.元表和元方法
元表本质就是一个普通的table表,它定义了原始值某些特殊操的行为,它里边游戏特殊键值,对应的做某些特殊操作的方法函数,这些函数叫元方法。
local t1 ={a}
local t2= {b}
t1 + t2 -- 非法,需要设置原表
--如何设置原表
local t = {}
-- 把t设为t1的元表
setmetatable(t1,t)
打印t1的元表和t ,会发现输出结果是一样的
print(getmetatable(t1))
print(t)
-- 设置对应的原表和元方法
local t1 = {}
local t2 = {}
local t3 = {} --设置没有元表的空表
local t = {}
local tb2 = {}
t.__add = function()
print("first meta")
return "+"
end
tb2.__add = function()
print("second meta")
return "-"
end
setmatetable(t1,t)
setmatetable(t2,tb2)
t1+t2 -- 打印 first meta ,发现第一个参数带有一个__add元方法时,lua使用第一个参数作为metatable,与第二个参数无关
t3 +t2 -- 打印 second meta,如果第二个参数有__add,就把他作为metatable,如果第一第二都没有对应元方法,就报错
-- __index
local t1 = setmetatable({name = "wbb1"},{
__index = function(t1,key)
print("this is __insdex")
if key == "wbb2" then
return "wbb2"
else
return
end
end
})
print(t1.name) --"wbb1"
print(t1.wbb2) -- "this is __insdex wbb2"
print(t1.wbb3) -- this is __insdex nil
local t2 = {name = "wbb3"}
local t3 = {__index = {name = "wbb4",age = 24}}
setmetatable(t2,t3)
print(t2.name) -- "wbb3"
print(t2.age) -- 24
-- __index可以对应一个表或者一个方法
--1.对应一个方法,如果原表没有找到索引,就去元表里执行方法
--2.对应一个表,就在元表里
--__newindex
1.__newindex对应的是方法时:
添加时,如果原表中没有key.会到元表中查询__newindex
local t4 = {} --元表
t4.__index = function(table,key) -- 查询
print("没有这个key")
end
t4.__newindex = function(tabel,key,value) -- 更新
print("__newindex")
end
local t5 ={}
setmetatable(t5,t4)
t5.name = "wbb" -- 复制,会查询__newindex
print(t5.name) -- 查询,打印“没有这个key”,返回nil
2.__newindex对应的是表时
local tt = {} --元表
local tt2= {name = "wbb"}
tt.__newindex = tt2
local tt3 = {}
setmetatable(tt3,tt)
print(tt2.name) -- "wbb"
tt3.name = "wbb2" --更新 __newindex
print(tt2.name) -- "wbb2"
print(tt3.name) -- nil
--__newindex 对应的是函数时,执行函数
--__newindex 对应的是表时,给表中新建元素,更新元素