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
参数概念,也不需要通过某个对象或表来调用。它们通常用于执行不特定于任何对象状态的任务,或者用于组织代码逻辑,提高代码的复用性和模块化。
没有使用点号或冒号的函数调用或定义,意味着它是一个独立的、不自动关联任何表的普通函数,这种函数的调用和参数传递完全取决于你在调用时所提供的参数。