当前位置: 首页 > news >正文

Lua 函数前的冒号和点号,你知道他们的区别吗?

1. 函数前的冒号和点号

点号(.)和冒号(:)的区别主要在于是否自动处理self参数。

在Lua中,函数定义时前面有点号(.)和冒号(:)的区别主要体现在函数如何处理其第一个参数,即隐式的self参数。具体来说:

  • 使用点号(.)定义或调用函数时,函数就是一个普通的函数,不会自动处理self参数。这种方式通常用于访问模块或表中的函数,而不是对象的方法。

  • 使用冒号(:)定义或调用函数时,Lua会自动将调用该方法的表作为第一个参数传递给函数,这个参数通常被命名为self。这种方式用于定义和调用对象的方法,能够让你在函数内部访问和操作对象的状态。

两者的区别如下述例子所示:

local myTable = {}
myTable.value = 5function myTable:setValue1(val)self.value = val
endfunction myTable:getValue1()return self.value
endfunction myTable.setValue2(table, val)table.value = val
endfunction myTable.getValue2(table)return table.value
end-- 使用冒号调用,Lua会自动把myTable作为第一个参数传递给setValue
myTable:setValue1(10)
print(myTable:getValue1())  -- 输出:10-- 使用点号调用,需要显式传递myTable作为参数
myTable.setValue2(myTable, 20)
print(myTable.getValue2(myTable))  -- 输出:20

在这个例子中,setValue函数使用了冒号定义,所以当你使用myTable:setValue(10)调用它时,myTable自动作为第一个参数(即self)传递给setValue。而getValue函数使用了点号定义,所以需要显式地将myTable作为参数传递给它。

2. 全局函数和局部函数

如果Lua函数定义或调用时既没有使用点号(.)也没有使用冒号(:),那么这个函数就被视为一个普通的全局函数或局部函数,不涉及任何隐式的self参数传递。这种情况下,函数的行为和参数传递完全基于显式提供的参数,与对象或表没有直接的关联。

2.1 全局函数

如果函数直接定义在脚本的顶级作用域中,没有绑定到任何表上,那么这个函数就是一个全局函数。全局函数可以在它们被定义的任何地方被调用,除非被局部作用域的同名变量遮蔽。

function globalFunction()print("这是一个全局函数")
endglobalFunction()  -- 调用全局函数

2.2 局部函数

如果函数使用local关键字定义,那么这个函数就是一个局部函数,它只能在定义它的那个作用域(及其子作用域)中被访问。

local function localFunction()print("这是一个局部函数")
endlocalFunction()  -- 调用局部函数

这种方式定义的函数不涉及到面向对象编程中的self参数概念,也不需要通过某个对象或表来调用。它们通常用于执行不特定于任何对象状态的任务,或者用于组织代码逻辑,提高代码的复用性和模块化。

没有使用点号或冒号的函数调用或定义,意味着它是一个独立的、不自动关联任何表的普通函数,这种函数的调用和参数传递完全取决于你在调用时所提供的参数。

http://www.lryc.cn/news/317823.html

相关文章:

  • 4、设计模式之建造者模式(Builder)
  • 网工内推 | 上市公司网工,IE认证优先,最高18K*13薪,包吃住
  • SQL Server 技术100问?
  • 鸿蒙不再适合JS语言开发
  • Python环境搭建 -- Python与PyCharm安装
  • OSCP靶场--Astronaut
  • Springboot 使用【过滤器】实现在请求到达 Controller 之前修改请求体参数和在结果返回之前修改响应体
  • Unity 3D常用的数据结构
  • h5唤起微信小程序
  • 面向对象(精髓)变继承关系为组和关系(_Decorator模式)
  • MES系统在智能生产中的重要作用
  • 2024.3.13每日一题
  • YOLOv5 | 涨点复现!YOLOv5添加BiFPN有效提升目标检测精度
  • 【Nut3】nuxt.config.ts项目nuxt配置文件介绍
  • 区块链技术的革命性影响
  • 多线程(volatile)
  • 蓝桥杯 填空 卡片
  • ELK介绍使用
  • 【UE5】非持枪状态蹲姿移动的动画混合空间
  • Windows C++ TCP开发(使用select函数以及设置非阻塞/Reuse属性)
  • ARM TrustZone技术解析:构建嵌入式系统的安全扩展基石
  • 初识Python语言-课堂练习【pyhton123题库】
  • chrome高内存占用问题
  • 【C语言】文件操作篇-----程序文件和数据文件,文件的打开和关闭,二进制文件和文本文件,fopen,fclose【图文详解】
  • 知识碎片收集
  • 不可不知!用例图的绘制与应用全指南深度解析
  • 【数据结构七】堆与PriorityQueue详解
  • uniapp写支付的操作
  • 微信小程序开发系列(二十四)·wxml语法·列表渲染·wx:for-item 和 wx:for-index
  • 下载无水印抖音视频