在lua中要想模拟类的继承,就需要用到lua元表的_index元方法。
原理就是当我们查找一个table中不存在的元素时,会调用
_index元方法来执行一套查找机制,凭借这个机制来模拟类
似的继承行为。
lua中没有类的概念,但是我们可以用table来模拟类,首先我们创建一个table来当类,里面有一个a来做这个类的成员
当我们访问这个类的成员时会打印出来成员的值,如果访问这个类中不存在的成员,则会打印nil。
class = {
a =
1
}
print(class.
a)
--结果是1
print(class.
b)
--结果是nil
然后我们再创建一个table,打算把它当做父类。
bassClass = {
b =
2
}
这时候需要对两个table进行操作就需要用到元表metatable了,把bassClass设为class的元表,把bassClass的元方法指向自己。
这样一个简单的继承就实现了。
bassClass = {
b =
2
}
class = {
a =
1
}
setmetatable(class, bassClass)
bassClass.
__index = bassClass
print(class.
a)
--结果是1
print(class.
b)
--结果是2
_index主要用于table的查询,当访问一个table的key时,会首先检查该table中是否有该key的字段,有则返回值,没有
则会检查元表中是否有_index元方法,没有则返回nil,有的话如果_index是一个table,那么就到_index方法所指的table中查找对应的属性和方法。
_index元方法不一定是table,也可以是一个函数,如果是一个函数,将返回该函数的返回值。