Lua点号和冒号区别

2023-11-07

定义的时候冒号默认接收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参数
[plain]  view plain copy
  1. function a:fun()   
  2. print(self.x)  
  3. end  
  4.   
  5. a.fun(a)  

将调用改成冒号,就可省略传自己进去
[plain]  view plain copy
  1. function a:fun()   
  2. print(self.x)  
  3. end  
  4.   
  5. a:fun()  



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

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

[plain]  view plain 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
  1. function test()  
  2.     t.f()  
  3.     t:g()  
  4.     t:h()  
  5.     t.i()  
  6.     t:h()  
  7.     t.j(t)  
  8.     t:h()  
  9. end  
  10.   
  11. t = {}  
  12.   
  13. function t.f()      
  14.     print("tf");  
  15. end  
  16.   
  17. function t:g()  
  18.     self.x = 10  
  19. end  
  20.   
  21. function t:h()  
  22.     print(self.x)  
  23. end  
  24.   
  25. function t.i()      
  26.     t.x = 20  
  27. end  
  28.   
  29. function t.j(k)      
  30.     k.x = 30  
  31. end  
输出:
[LUA-print] tf
[LUA-print] 10
[LUA-print] 20
[LUA-print] 30
发现冒号会提供一个内置table供function之间通信。

http://blog.csdn.net/stormbjm/article/details/38532413


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lua点号和冒号区别 的相关文章

  • 无法在cmake中使用find_package找到Lua标头

    我正在尝试使用 CMake 为我使用 Lua 的项目构建生成 make 文件 当我运行 make 时出现此错误 path to my project luaudio luaudio c 1 17 fatal error lua h No s
  • 代码说“尝试比较数字<=实例”

    It says Players ninjafox56 PlayerGui Shop ShopGui LightSide ChooseSideL 5 尝试比较数字 Rank game Players LocalPlayer leadersta
  • 覆盖 require 后调用 lua_getfield() 时崩溃

    这个问题与 Henri Menke 在这个问题中的回答相关 如何在 C 中获取预加载模块名称 https stackoverflow com questions 51510308 how to get preloaded module na
  • 如何在表中表示 nil

    假设我想存储一个元素列表 包括一些零值 值的位置很重要 我需要表示列表中给定位置处不存在值 这里有一个问题 a 1 2 3 nil 4 for k v in ipairs a do print k v end print a 4 print
  • 在 lua 中使用相等运算符比较数字有多安全?

    在我的引擎中 我有一个用于脚本编写的 Lua VM 在脚本中 我写了这样的内容 stage stage 1 if stage 5 then end and objnum tonumber 5 if stage objnum 根据 Lua 来
  • 循环直到在表中找到 2 个特定值?

    我试图找到一种更聪明的方法来解决这个问题 这是与游戏相关的代码的摘录 它循环遍历每个背包的每个插槽 直到找到铲子和绳子 local continue local foundShovel foundRope for i 0 Container
  • 使用 corona sdk 验证电子邮件地址

    在我的项目中 有一个供用户填写详细信息的表单 其中有一个文本字段用于输入用户的电子邮件 ID 所以我需要在 corona 项目中验证该文本字段中的电子邮件 试试这个正则表达式 local email email protected cdn
  • 为什么 LuaJIT 和 Lua 中的数字舍入格式不同?

    Using string format 据说遵循 Csprintf 在 LuaJIT 轮次中格式化数字与我尝试过的所有其他 Lua 解释器不同 lua v Lua 5 4 1 Copyright C 1994 2020 Lua org PU
  • 用于嵌入式服务器的 Web 技术

    我最近开始了一个针对嵌入式设备的新 Web 开发项目 并希望征求一些有关使用技术的建议 该设备将提供 HTML 页面 其中包括用于从 JSON 服务器检索数据的 AJAX 代码 我们暂时使用 Cherokee 作为 Web 服务器 但我们并
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • corona sdk中拖动物理对象

    我尝试在场景中拖动重力 0 0 的动态主体 我有一个主体类型为动态的正方形 以及一个主体类型为静态的图像 但是当将方形拖动到图像上时 它会产生一点力 但是可以超出图像并传递到另一边 如图所示 这是我拖动正方形的代码 local functi
  • 什么时候适合使用Lua这样的嵌入式脚本语言

    我玩 魔兽世界 大约有两年了 我对用来编写插件的 Lua 很好奇 由于到目前为止我读到的有关 Lua 的内容都是 快 轻 和 这太棒了 所以我想知道如何以及何时使用它 您需要在系统中嵌入像 Lua 这样的脚本语言的典型情况是什么 当您需要最
  • 如何在Conky中实现一个基本的Lua功能?

    我正在尝试向我的 Conky 添加一个函数 该函数打印字符串的长度以用于调试目的 代码位于名为的文件内test lua 非常简单 function test word return string len word end 我这样加载它 在我
  • 确定已编译Lua的编译器版本

    我有一些已编译的 LuaQ 我需要确定用于编译它的确切版本 有什么可能的方法吗 编译的脚本在文件开头有一个标头 4 bytes signature x1bLua 1 byte version 0x51 1 byte format 1 byt
  • 在lua中组合两个函数

    我刚开始学习lua 所以我的要求可能是不可能的 现在 我有一个接受函数的方法 function adjust focused window fn local win window focusedwindow local winframe w
  • Lua 从 5.1 更新 - LUA_GLOBALSINDEX 问题

    我最近将旧的 Lua 5 1 项目更新到了该库的最新版本 但遇到了问题LUA GLOBALSINDEX 它变得不确定 我只用过它lua getfield函数 像这样 void luastartgame void if startgamefu
  • lua中的权限问题

    是否需要在 corona build settings 中设置一些特定权限才能将高分永久保存在文件中 每次运行代码时都会出现 权限被拒绝 的错误 如何纠正这个错误 这是我尝试过的代码 function read score local f1
  • 安装Lua套接字库

    要么我太累了 要么我瞎了 我想学习 Lua 网络 因此我必须安装socketlib 所以我可以轻松地要求它 但我不知道我应该 要求 哪些文件 例子说 local socket require socket 但正如我所说 如果我使用 我不知道
  • 如何在我的 Lua 脚本中添加“睡眠”或“等待”?

    我正在尝试通过更改一天中的时间来为游戏制作一个简单的脚本 但我想快速完成 这就是我要说的 function disco hour minute setTime 1 0 SLEEP setTime 2 0 SLEEP setTime 3 0
  • gsub 的转义字符串

    我读了一个文件 local logfile io open log txt r data logfile read a print data output n w r 1 2 n t x re S 是的 日志文件看起来很糟糕 因为它充满了各

随机推荐

  • 精确计算-BigDecimal类

    基本方法 加法 add 函数 减法 subtract 函数 乘法 multiply 函数 除法 divide 函数 绝对值 abs 函数 重点介绍除法 使用除法函数在divide的时候要设置各种参数 要有除数 精确的小数位数和舍入模式 舍入
  • BUUctf-web:[ACTF2020 新生赛]Exec1

    1 就是按位或 直接执行 后面的语句 2 就是逻辑或 如果前面命令是错的那么就执行后面的语句 否则只执行前面的语句 3 就是按位与 前面和后面命令都要执行 无论前面真假 4 就是逻辑与 如果前面为假 后面的命令也不执行 如果前面为真则执行两
  • Form表单之get提交与post提交

    Form表单之get提交与post提交 Form表单的属性action 与method 属性 值 描述 action URL 规定当提交表单时向何处发送数据 method get post 规定用于发送form data的HTTP方法 提交
  • 兆易创新嵌入式软件工程师笔试题目解析

    哈喽 大家好 今天分享的是兆易创新的嵌入式软件开发工程师的笔试题目 这份题目中等难度 考察基础知识的偏多 最后的编程题只考了一个结构体数组的初始化 所以 在准备校招时 将重点还是要放在基础知识上 下面看下这份题目你可以答几分 本文已同步更新
  • Connect Dynamics 365 and Social Engagement

    Establish a connection between Social Engagement and Dynamics 365 To connect Dynamics 365 online and Social Engagement b
  • 通达信四色谱四量图源码_通达信指标公式源码波段抄底副图指标

    入市建仓 VAR2 REF LOW 1 VAR3 SMA ABS LOW VAR2 13 1 SMA MAX LOW VAR2 0 13 1 100 VAR4 EMA IF CLOSE 1 2 VAR3 13 VAR3 13 13 VAR5
  • 飞书文档导出pdf不带书签/大纲 问题

    问题 我在飞书上整理了很多笔记 有天想把它导出本地 主要原因是有时候网络不好时 网页版的飞书加载比较慢 此外 我还想将其打印成纸质版来看 比较有感觉 飞书我是可以看到各个大纲级别的标题的 一级大纲 二级大纲这样整理非常方便 但是当我导出为p
  • 交叉编译tslib (正确版)

    1 下载安装交叉编译器 编译器版本不限 需要与系统移植时的编译器保持一致即可 2 下载tslib1 4 3 交叉编译tslib 1 4 下载的tslib 1 4 tar gz放到 home driver ts 目录下 cd home dri
  • 手写算法-Python代码实现非线性回归

    手写算法 Python代码实现非线性回归 生成非线性数据集 1 用线性回归拟合 2 多项式拟合 sklearn实现 校验系数的结果 总结 生成非线性数据集 前面我们介绍了Python代码实现线性回归 今天 我们来聊一聊当数据呈现非线性时 这
  • 嵌入式监控【v4l2采集->vpu编码->live555推流】

    嵌入式监控 v4l2采集 gt vpu编码 gt live555推流 文章目录 嵌入式监控 v4l2采集 gt vpu编码 gt live555推流 介绍 数据流图 一 v4l2 1 1 确定cam的输出格式 1 2 YUYV 转 YUV4
  • 【机器学习系列】如何将多条ROC曲线画在一张图里,并解决文本遮挡问题

    有的时候我们需要将ROC曲线输出在同一张图中 这样可以更加直观地对比模型 并且我们常常会遇到在图形中有文字相互遮挡的问题 我们可以用adjustText中的adjust text来实现文本不相互遮挡并添加箭头的功能 定义多条roc曲线画图函
  • 股票交易系统的服务器,股标交易传输系统

    本词条缺少概述图 补充相关内容使词条更完整 还能快速升级 赶紧来编辑吧 股标交易传输系统在Windows 环境下将原有的传输和显示系统进行改进 使它们在 Windows 环境下可以并发执行 而且可以和其它应用 程序协调地共享资源 这不仅实现
  • 基于labview实现MYSQL数据库查询功能

    前言 labview是一款功能强大的图形化编程软件 也就是俗称的G语言 本篇将介绍如何利用labview对MYSQL进行列表分页 范围查询及模糊查询等几个可广泛应用的简易功能 但事实上labview并不擅长处理数据库 下面详细代码可体现 数
  • spring-boot,java 微服务,跨域配置

    只需要在启动类下面与run方法同级加上下面那串代码即可 public static void main String args SpringApplication run ApplicationService class args Over
  • Visual Studio 2019中使用Qt,步骤详解

    本文学习的目的就是在Visual Studio 2019环境下能够顺利的运行Qt程序 下面是一些具体的配置安装过程 首先 打开visual Studio 2019 继续但无需代码 如图 然后点击扩展 管理扩展 在搜索框中搜索Qt 点击下载插
  • 上个厕所的功夫,就把定时任务的三种调度策略说得明明白白

    Spring Task 无疑是 Spring 环境下单机定时任务的首选 它用起来非常简单 功能也够用 Spring Task 有三种模式 分别是 fixedDelay cron 和 fixedRate 话不多说 我们先看代码 Slf4j C
  • JUC多线程及高并发

    文章目录 1 对volatile的理解 2 CAS 3 原子类AtomicInteger的ABA问题 原子更新引用 4 ArrayList线程不安全的案例 5 公平锁 非公平锁 可重入锁 递归锁 自旋锁 6 CountDownLatch C
  • SpringBoot支付宝沙箱支付步骤

    步骤1 注册一个沙箱号 网站https open alipay com platform home htm 使用自己真实的支付宝扫描进去 进行注册沙箱支付宝 步骤2 下载密匙生成工具 下载完毕 解压 双击运行 网址 https opendo
  • 重磅:国产IDE发布,由阿里研发,完全开源!​(高性能+高定制性)

    经历近 3 年时间 在阿里集团及蚂蚁集团共建小组的努力下 OpenSumi 作为国内首个强定制性 高性能 兼容 VS Code 插件体系的 IDE 研发框架 今天正式对外开源 1 OpenSumi 是什么 OpenSumi 是一款面向垂直领
  • Lua点号和冒号区别

    定义的时候冒号默认接收self参数 调用的时候冒号默认传递调用者自己为参数 而句号要显示传递或接收self参数 例如 句号定义 需要显示传递或接收 plain view plain copy a x 1 function a fun sel