加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Lua点号和冒号区别

发布时间:2020-12-14 22:07:55 所属栏目:大数据 来源:网络整理
导读:定义的时候冒号默认接收self参数 调用的时候冒号默认传递调用者自己为参数 而句号要显示传递或接收self参数 -- 例如:句号定义,需要显示传递或接收 [plain] ? view plain copy a?=?{?x?=?1?}?? function?a.fun(self)??? print(self.x)?? end?? ?? a.fun(a)-

定义的时候冒号默认接收self参数
调用的时候冒号默认传递调用者自己为参数
而句号要显示传递或接收self参数

-- 例如:句号定义,需要显示传递或接收

[plain]? view plain copy
  1. a?=?{?x?=?1?}??
  2. function?a.fun(self)???
  3. print(self.x)??
  4. end??
  5. ??
  6. a.fun(a)--输出1,将a自己做为参数传给fun函数的self??

这样调用要传递self,比较麻烦,所以lua给一个方便的方法
将函数定义改成冒号,就可以省略self参数
copy
    function?a:fun()???
  1. print(self.x)??
  2. end??
  3. ??
  4. a.fun(a)??

将调用改成冒号,就可省略传自己进去
copy
    a:fun()??


最后说明一下,如果不用self,直接在函数里使用x是不行的

之前以为可以像c++类一样,成员函数可以直接使用类成员变量

copy
  1. function?a:fun()???
  2. print(x)--将输出nil,找不到这个x??
  3. end??
----------------------------------------------------------------------------------------------------



? lua本身没有类功能,它的类功能是通过元表来实现的。类的函数调用通过obj:function方式。但类的成员赋值又是通过obj.var方式来实现的。翻阅lua 5.1手册,发现对于冒号只有这么一段解释。(lua 5.1手册)

冒号语法可以用来定义方法, 就是说,函数可以有一个隐式的形参 self。 因此,如下写法:
? ? function t.a.b.c:f (params) body end
是这样一种写法的语法糖:
? ? t.a.b.c.f = function (self,params) body end

然后我做了如下测试,来弄清楚冒号的用法
[cpp]? view plain copy
    function?test()??
  1. ????t.f()??
  2. ????t:g()??
  3. ????t:h()??
  4. ????t.i()??
  5. ????t.j(t)??
  6. end??
  7. ??
  8. t?=?{}??
  9. function?t.f()??????
  10. ????print("tf");??
  11. function?t:g()??
  12. ????self.x?=?10??
  13. function?t:h()??
  14. ????print(self.x)??
  15. function?t.i()??????
  16. ????t.x?=?20??
  17. function?t.j(k)??????
  18. ????k.x?=?30??
  19. end??

输出:
[LUA-print] tf
[LUA-print] 10
[LUA-print] 20
[LUA-print] 30

发现冒号会提供一个内置table供function之间通信。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读