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

1. 函数前的冒号和点号

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

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

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

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

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

lua 复制代码
local myTable = {}
myTable.value = 5

function myTable:setValue1(val)
    self.value = val
end

function myTable:getValue1()
    return self.value
end

function myTable.setValue2(table, val)
	table.value = val
end

function 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 全局函数

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

lua 复制代码
function globalFunction()
    print("这是一个全局函数")
end

globalFunction()  -- 调用全局函数

2.2 局部函数

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

lua 复制代码
local function localFunction()
    print("这是一个局部函数")
end

localFunction()  -- 调用局部函数

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

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

相关推荐
开发者小天4 分钟前
React中的useRef的用法
开发语言·前端·javascript·react.js
xixixin_13 分钟前
【React】检测元素是否出现在用户视窗内
开发语言·前端·javascript·react.js
Js_cold24 分钟前
Verilog局部参数localparam
开发语言·fpga开发·verilog
Acrelhuang27 分钟前
小小电能表,如何撬动家庭能源革命?
java·大数据·开发语言·人工智能·物联网
头发还没掉光光35 分钟前
Linux网络初始及网络通信基本原理
linux·运维·开发语言·网络·c++
疏狂难除36 分钟前
spiderdemo第22题与webassembly的跨域
开发语言·javascript·爬虫·rust·wasm·mitmproxy
WenGyyyL44 分钟前
微信小程序开发——第二章:微信小程序开发环境搭建
开发语言·python·微信小程序
循环过三天1 小时前
3.2、Python-元组
开发语言·python
一抓掉一大把1 小时前
RuoYI框架.net版本实现Redis数据隔离
java·开发语言
m0_748248021 小时前
揭开 C++ vector 底层面纱:从三指针模型到手写完整实现
开发语言·c++·算法