在lua中,冒号: 和点. 对于函数的影响是函数的定义和调用.
定义函数可以用点也可以用冒号
function mytable.fun(p)
return p
end
function mytable:fun(p)
return p
end
用冒号: 定义的函数有个特性,那就是在函数里可以使用self来表示本身的表。self 不是lua 关键字,但是却和c#,c++里的this有异曲同工之妙。
function mytable:fun(p)
print(self) -- self 代表了本身的表
return p
end
当我们在用点.定义的函数里使用self 的时候,self 会是nil值。
说完函数定义,在解释下两种函数调用的区别。
用冒号: 和用点. 都可以调用到同一个函数,但是在传入的参数方便却是有些不同的。
local mytable = {name = “jayden”,age = 18}
function mytable:fun1(p)
print(self)
print(p)
print(self.name)
end
使用冒号来调用冒号定义的函数
mytable:fun1("jk")
-- 输出
-- table: 01D59712
-- jk
-- jayden
可见使用冒号来调用的是,self 是mytable 本身,且可以正确调用。
使用点来调用冒号定义的函数
mytable.fun1("jk")
-- 输出
-- jk
-- nil
-- nil
可以看到当用点来调用冒号定义的函数时,如果函数内有用到self,则self就是传入的第一个参数,示例中的“jk”作为第一个参数赋值给了self,而想输出的p值却缺失了,变成了nil。
我们再来看看点定义的函数,用冒号来调用会怎么样
function mytable.fun1(p1,p2)
print(p1)
print(p2)
end
用冒号来调用点定义的函数
mytable:fun("jayden",18)
--输出
--table:00C58710
--jayden
是不是很奇怪?在用冒号来调用函数时,会强制把自身作为第一个参数传入到函数中,此时p1 已经强制被变成了mytable,而jayden则作为了第一个参数传入到了函数里。