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

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

相关推荐
tyler-泰勒2 分钟前
c++:迭代器的失效
开发语言·c++
白晨并不是很能熬夜8 分钟前
【JVM】字节码指令集
java·开发语言·汇编·jvm·数据结构·后端·javac
IT、木易8 分钟前
大白话解释 JavaScript 中的this关键字,它在不同场景下是如何取值的?
开发语言·javascript·ecmascript
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧14 分钟前
C语言_数据结构总结7:顺序队列(循环队列)
c语言·开发语言·数据结构·算法·visualstudio·visual studio
LIUJH123317 分钟前
数据结构——单调栈
开发语言·数据结构·c++·算法
Tomorrow'sThinker2 小时前
Python零基础学习第三天:函数与数据结构
开发语言·windows·python
元媛媛2 小时前
Python - 轻量级后端框架 Flask
开发语言·python·flask
钢板兽2 小时前
Java后端高频面经——Spring、SpringBoot、MyBatis
java·开发语言·spring boot·spring·面试·mybatis
winyh52 小时前
Vite 打包后Nginx部署配置
运维·nginx
爱吃柠檬呀2 小时前
《C陷阱与缺陷》读书笔记(一)
c语言·开发语言·算法·《c陷阱与缺陷》·编写程序