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

先看一下类的写法


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容