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中的classobject都在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

所以,那三行代码是一个组合拳,用来达到继承属性的效果。

上一篇下一篇

猜你喜欢

热点阅读