lua学习笔记(一)
2019-12-10 本文已影响0人
overflow_e4e4
lua面向对象
Rectangle = { }
function Rectangle:init( width, height)
o = {}
self.__index = self
setmetatable(o, self)
o.height = height
o.width = width
return o
end
function Rectangle:calArea()
return self.width * self.height;
end
有意思的是在lua中,最基本的结构是table,需要用table来描述对象的属性。所以可以理解java
中的class
和object
都在lua
中都是table。可以自定义一个函数来修改原table
的各个属性然后返回修改对象来模仿面向对象编程中的new
,从而新建一个对象
(其实是table
)。
其中关键的三行代码:
o = {}
self.__index = self
setmetatable(o, self)
首先新建一个table,
setmetatable
函数是将后者设为前者的元表,self.__index = self
是将自己设置自己的__index 元方法
。原因如下:
-- 1.t中是否有k,有则直接返回值,否则第2步
-- 2.t是否有元表, 无则返回nil, 有则第3步
-- 3.t的元表是否有__index元方法, 无则返回nil, 有则查找__index指向的表或对应的方法
如果用代码来解释的话:
metaT = { foo = 3 }
t = setmetatable({}, metaT)
print(t.foo)--此时为nil
metaT = { foo = 3 }
t = setmetatable({}, {__index = metaT})
print(t.foo)--此时为3
所以,那三行代码是一个组合拳,用来达到继承属性的效果。