美文网首页
Lua练习16-冒号和点号

Lua练习16-冒号和点号

作者: GameObjectLgy | 来源:发表于2022-01-10 16:42 被阅读0次
    local Animal = {}
    
    function Animal:Eat( food )
        print("Animal:Eat", self, food)
    end
    
    function Animal.Sleep( time )
        print("Animal.Sleep", self, time)
    end
    
    Animal:Eat("grass")
    Animal.Eat("grass")
    Animal:Sleep(1)
    Animal.Sleep(1)
    

    在编辑器中可见,可以看到sleep函数的self下方是有波浪线的。
    解析:
    1、Animal:Eat("grass")的结果:
    Animal:Eat table: 0x7f8421c07540 grass
    说明调用时,将自身Animal 这个表作为self传递了进去。
    2、Animal.Eat("grass")的结果:
    Animal:Eat table: 0x7f8421c07540 grass
    用不同调用方式调用了Animal的Eat("grass"),但是却得到一样的输出结果,说明在Eat(冒号函数)内部有一个参数self,因为Eat方法在定义的时候写了冒号,后面不管怎么调用,都会有一个默认参数内部self,而且这个self就是自己本身这个对象。

    3、Animal:Sleep(1)的结果:
    Animal.Sleep nil table: 0x7f8421c07540
    4、Animal.Sleep(Animal)的结果:
    Animal.Sleep nil table: 0x7f8421c07540
    可以看到,不管用什么方式去调用Sleep方法,结果都是一样的,因为Sleep在定义的时候用的是点号,内部没有参数self。

    -- 我们为什么可以用.和:来定义函数
    function Animal.Sleep( time ) end
    -- 这种写法是一种语法糖(syntactic sugar),它的原型是:
    Animal.Sleep = function ( time ) end

    用双冒号(:)时,也是一种语法糖,实际上默认传递一个self(Animal)参数:
    function Animal:Eat( food ) end
    等价于
    function Animal.Eat( self, food ) end

    参考:https://www.cnblogs.com/zzya/p/5778119.html

    相关文章

      网友评论

          本文标题:Lua练习16-冒号和点号

          本文链接:https://www.haomeiwen.com/subject/rhkiyktx.html