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参数概念,也不需要通过某个对象或表来调用。它们通常用于执行不特定于任何对象状态的任务,或者用于组织代码逻辑,提高代码的复用性和模块化。

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

相关推荐
KaMeidebaby14 分钟前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_176844 分钟前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
Mininglamp_27181 小时前
Claude Code 封禁中国开发者之后:本地 AI 编程工具的替代方案实测
开发语言·人工智能·windows·开源软件·ai-native
思麟呀2 小时前
C++17(三)if constexpr+折叠表达式
开发语言·c++
醉城夜风~2 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
qydz112 小时前
杰理开发基础知识(3)
开发语言·嵌入式开发·杰理科技
贾斯汀frank2 小时前
C# 15 类型系统改进:Union Types
开发语言·windows·c#
阿里嘎多学长2 小时前
2026-07-10 GitHub 热点项目精选
开发语言·程序员·github·代码托管
CHHH_HHH2 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
吴懿不在3 小时前
apisix~OpenResty各阶段的介绍
openresty