LUA面向对象编程之点号与冒号

2016-08-18  本文已影响276人  老虎Alex

先看一下类的写法

Test = {}

Test.__index = Test

function Test:new(x,y)

    local temp = {}

    setmetatable(temp, Test)

    temp.x = x

    temp.y = y

    return temp

end

function Test:fun1()    -- 这里用冒号

    print('fun1 : ',self.x,self.y)

end

function Test.fun2()    -- 这里用点号,函数内访问了成员变量

    -- 该函数无法调用,无法识别self

    print('fun2 : ',self.x,self.y)

end

function Test.fun3(obj)    -- 这里用点号,函数内访问了成员变量

    print('fun3 : ',obj.x,obj.y)

end

object1 = Test:new(10,20)

print('object1:fun1()')

object1:fun1()  -- 使用冒号调用函数

print('object1.fun1(object1)')

object1.fun1(object1)  --使用点号调用函数,可以调用,但是需要显式传参数self    -- line1

-- object1.fun2() -- 无法调用,无法识别self

print('object1.fun3(object1)')

object1.fun3(object1)

print('object2 = Test.new(10,20)')

object2 = Test.new(10,20)  --可调用,但是第一个参数10会被认为是self,故最终打印出来,x值为20,而y没有赋值,为nil

object2:fun1()    --输出结果为"20 nil"

object2.fun1(object2)    --输出结果为"20 nil"

总结:

用在声明对象时,冒号默认接收第一个参数为self指针,然后才是显式声明的参数,点号没有自动添加参数,所以冒号适用于需要访问成员变量的函数,点号适用于不需要访问成员变量的函数

在调用函数时,冒号会在函数列表插入一个self的参数,点号不会,如果在声明函数是使用了冒号,而调用的时候想用点号,则需要自己手动添加第一个参数self,如line1

上一篇 下一篇

猜你喜欢

热点阅读