语法糖补充 之 lua 中 . 和 : 的区别
前情提要
首先我要说,这篇文章我写的很 NB ,正在学 lua 的 和分不清上边的区别的可以一看。
其次,如果你没有看完 老唐课程的 table表实现类 到 Lua面向对象,我希望可以看完再说。
最后,我发现 社区 自带的 markdown 编辑器让我看不出来 点 和 句号 的区别,预览的时候是 点 出来 却变成 句号 了,也就只能这样了,各位就把所有的 句号 当成 点 就行了。
正文
相信在使用 lua 时,很多时候都分不清这个 . 和 : 的区别 , 我只有一个诀窍,那就是看 : 和 . 强调:这可不是废话,往后看吧
我是在 学习 lua 老唐课程里那个 lua 面向对象之继承的时候 突然就蒙圈了,不知道怎么用 : 和 . 的,本来就 苦 lua 已旧,非的把这个 : 和 . 学明白。
举一个例子:
列子 1:
function MainScene:ctor()
self:ceshi(1,2,3)
end
function MainScene:ceshi(a,b,c)
print(a,b,c)
end
-- 输出:1 2 3
-- 分析:默认传self,默认接受self。
这个时候 self:ceshi(1,2,3)
来调用 MainScene:ceshi(a,b,c)
可以看到 是 :
调用 :
接受。而 :
在调用的时候会默认传递 调用者 出去,:
接受的时候会默认接受一个参数。我们可以想象 接受者MainScene:ceshi(a,b,c)
使用的这个 :
上边的这个比 .
多出来的 .
就是一个用来接受的形参,调用者self:ceshi(1,2,3)
:
头上的 .
也是一个默认传出的一个实参。
意思是把 :
看成 用 两个 .
组合在一起的,一个点是调用,一个点是参数。
既然之后的 print
打印的是 ( a,b,c )
那么输出的结果自然而然的就是 123
列子 2:
function MainScene:ctor()
self:ceshi(1,2,3)
end
function MainScene.ceshi(a,b,c) --注意是.
print(a,b,c)
end
-- 输出:userdata 1 2
-- 分析:调用ceshi函数时用的:默认传递self为第一个参数,
-- 但是函数声明的时候用的 . 所以不会有默认隐藏的self去接收,
-- 此时传递参数为 self 1 2 3 但是ceshi函数只接收3个参数所以3被抛弃。
这个时候 self:ceshi(1,2,3)
来调用 MainScene:ceshi(a,b,c)
可以看到 是 :
调用 .
接受。而 :
在调用的时候会默认传递调用者出去, .
接受的时候仅仅接受我在括号里写的那些个形参。我们可以想象 ,调用者self:ceshi(1,2,3)
:
头上的 .
也是一个默认传出的一个实参 , 而 接收者 MainScene.ceshi(a,b,c)
却 不以为然 认为 老子要几个你就给几个。
- 那么
接收者 MainScene.ceshi(a,b,c)
用来接受的形参就是 a
、b
、c
既然之后的 print
打印的是 ( a,b,c )
那么输出的结果自然而然的就是 self 1 2
列子 3:
function MainScene:ctor()
self.ceshi(1,2,3) --注意是.
end
function MainScene.ceshi(a,b,c) --注意是.
print(a,b,c)
end
-- 输出:1 2 3
-- 分析:默认不传递self,默认不接受self
这个时候 self.ceshi(1,2,3)
来调用 MainScene.ceshi(a,b,c)
可以看到 是 .
调用 .
接受。而 .
在调用的时候会仅仅传递括号里有的出去, .
接受的时候仅仅接受我在括号里写的那些个形参。我们可以想象 ,调用者self.ceshi(1,2,3)
说老子给你几个你就拿几个 , 而 接收者 MainScene.ceshi(a,b,c)
说 老子要几个你就给几个。
那么 调用者 self.ceshi(1,2,3)
用来传出的参数就是 1
、2
、3
那么 接收者 MainScene.ceshi(a,b,c)
用来接受的形参就是 a
、b
、c
既然之后的 print
打印的是 ( a,b,c )
那么输出的结果自然而然的就是 1 2 3
列子 4:
function MainScene:ctor()
self.ceshi(1,2,3) --注意是.
end
function MainScene:ceshi(a,b,c)
print(self)
print(a,b,c)
end
-- 输出:1
-- 2 3 nil
-- 分析:函数调用时用的 . 不会传递self 只传递1 2 3,而ceshi函数声明时用的 : 默认有一个self在第一位去接收,
-- ceshi函数能接收4个参数,即 self a b c ,所以c没有接收参数为nil。
-- 在lua中模拟面向对象编程中,可以用 . 来表示类方法,而 : 可以用来表示成员方法。<br />
这个时候 self.ceshi(1,2,3)
来调用 MainScene:ceshi(a,b,c)
可以看到 是 .
调用 :
接受。而 调用者self.ceshi(1,2,3)
在使用 .
调用的时候 会仅仅传递括号里有的出去,:
接受的时候会默认接受一个参数。我们可以想象 接受者MainScene:ceshi(a,b,c)
:
上边的 .
就是一个用来接受的形参。
那么 调用者 self.ceshi(1,2,3)
用来传出的参数就是 1
、2
、3
那么 接收者 MainScene:ceshi(a,b,c)
用来接受的形参就是 .
、a
、b
、c
(👆 这个点: ` . ` 也是一个默认接受的一个形参。)
既然之后的 print
打印的是 ( a,b,c )
那么输出的结果自然而然的就是 2 3 nil