self机制
下例代码为例 定义test方法是 a.test(self,n1,n2) 那调用的时候 a.test(a,3,4) 可以显示的传入self
self则代表对象本身
如b 模块定义的test方法 b:test(n1,n2) 调用的时候 b:test(3,4) 这样是隐式的传入了b 可以在test方法中获取到self对象本身 使用b.test(b,3,4) 显示的传入本身也是可以的 你也可以使用b.test(3,4)方式调用 但这样是不会将本身传入到方法里的
self机制要正常运行
(1)定义的函数必须使用:才会有隐式的传递self机制
(2)调用的时候也要使用:
(3)或者是使用b.test(b,3,4)这样子也是可以的
(4)又或者是a.test(a,3,4)这样子也是可以的
local a = {}
function a.test(self,n1,n2)
print("a.test", self)
print(n1,n2)
end
a.test(a, 3, 4)
local b = {}
function b:test(n1,n2)
print("b:test", self)
print(n1,n2)
end
b:test(3, 4)
b.test(b, 3, 4)
元表
-两个表相加 第一个参数是一个表 第二个参数也是一个表
-meta_a 叫做a的元表
-元表里面有一个非常重要的key:__index,
-当我们搜索一个表的key的时候 如果在当前的表里面没有搜索到
-lua解释器 会去这个表的元表里面的__index这个key对应的表里面来查找
-注意 这里是优先在当前表查找找不到了才会去元表里面的__index对应的表里面来查找
local a = {
--name = "bb"
}
local meta_a = {
__index = {
name = "zz",
age = 34,
sex = 0,
}
}
setmetatable(a,meta_a)--设置表的元表
print(getmetatable(a))--获取表的元表
print(a.name)
输出
面向对象
--c/c++ java lua是没有面向对象的语法的
--但是我们可以模拟它
local base = {
sex = 1,
}
function base:test()
print("base:test")
end
function base:new(instant)
if not instant then
instant = {}
end
setmetatable(instant,{__index = self})
return instant
end
--可以添加其他更多的函数
--base叫做类的表
--做一个类的实例
local bb = base:new({
name = "zazz",
age = 20,
})--new 的self 就是这个base表
print("bb.name = "..bb.name)
print("bb.sex = "..bb.sex)
--在new里面把新创建的实例的表的元表变成了base
bb:test()-- test self对象就是我们的b
--面向对象的基本步骤
--(1)定义一个类的表
--(2)定义一个实例的表
--(3)为这个实例的表加一个元表 并且元表__index指向了这个类的表
--(4)利用self基础表的实例:表的函数的时候 隐式的帮我们传递了
--实例的表为self到函数里面
输出
继承和重载
--继承 基类是 person 子类 :man
--基类
local person = {}
function person:test()
print("person:test",self)
end
function person:get_age()
print("person:get_age",self)
end
function person:new(instant)
if not instant then
instant = {}
end
setmetatable(instant,{__index = self})
return instant
end
--子类的表
local man = person:new()
function man:test_man()
print("man:test_man",self)
end
function man:test_man2()
print("man:test_man2",self)
end
function man:get_age()
print("man:get_age",self)
--如果想要调用基类的重载函数 那么直接显示的调用即可
person.get_age(self)
end
--为这个man类实例化一个类的表
local p = man:new() --new 的self里面不再是person而是man了
--p的元表里面的__index = 类的表
--调用的时候会在p的元表man里面查找
p:test_man()
--调用的时候会在p的元表man里面查找 找不到了会去 man的元表person里面查找
p:test()
--重载
--调用重载的时候先会去p的元表man查找get_age 找到了
--就不会再去man的元表person里面找了
p:get_age()
输出