Lua中點號和冒號的應用在函數的定義和調用這兩種場合可以互相替換,拋磚引玉,先給出Lua5.3參考手冊對於點號冒號區別的解釋,例子略有簡化:
函數的定義:冒號 語法可以用來定義 方法, 就是說,函數可以有一個隱式的形參 self
。 因此,如下語句
function f(params) body end是這樣一種寫法的語法糖function f(self, params) body end
函數的調用:冒號 可以用來調用 "方法"。 這是 Lua 支持的一種語法糖。 像 table:func(args)
這個樣子, 被解釋成 table.func(table,args)
下面例子說明了冒號之於點號是一種語法糖關係,起到了簡化編碼的作用
--點號
local player1 = {level = 1}
function player1.setLevel(self, lv) --函數定義使用點號,需傳表自身做型參,這裏不一定用self也可起其他名字
self.level = lv
end
player1.setLevel(player1, 15) --等價於:player1:setLevel(15)
print("After player1.setLevel, player1.level = ",player1.level)
--冒號
local player2 = {level = 1}
function player2:setLevel(lv) --函數定義使用冒號,無需傳入表自身,可通過self.快速訪問
self.level = lv
end
player2:setLevel(20) --等價於:player2.setLevel(player2,20)
print("After player2:setLevel, player2.level = ",player2.level)
仔細品讀這個例子,可以看出函數定義和調用使用點號和冒號兩者可以互換,也可以混合使用(點號定義冒號調用,或者冒號定義點號調用)當然這種做法不提倡沒有必要。
現在還有個問題,模塊需要定義一些函數時,什麼時候適合使用冒號,什麼時候適合使用點號?
上面的例子有個模塊需要訪問自身成員變量的需求,再來看一個模塊不需要訪問成員變量的例子:
--點號
local calculator1 = {}
function calculator1.add(a, b)
return a + b
end
print("calculator1.add(1, 2) = " .. calculator1.add(1, 2))
--冒號
local calculator2 = {}
function calculator2:add(a, b)
return a + b
end
print("calculator2:add(1, 2) = " .. calculator2:add(1, 2))
可以看出當模塊不需要訪問自身成員時,從定義到調用都和模塊無關,因此無需使用冒號語法糖,僅用點號即可。
總結:
1.冒號和點號應用於函數的定義和調用兩種場合,冒號是點號的語法糖,冒號相比於點號起到簡化編碼的作用。
2.在定義時冒號相比於點號第一個參數默認傳個形參self(也可改名,含義是模塊本身),調用時冒號相比於點號第一個參數默認傳個實參模塊名本身
3.模塊需要訪問自身成員變量時,使用冒號定義;模塊無需訪問自身成員變量時,使用點號定義。
4.冒號和點號可以混合使用,但是不提倡沒必要