Lua中的點 冒號與self

2021-09-28 14:39:43 字數 1979 閱讀 3349

lua中的點、冒號與self,它們之間的關係主要體現在函式的定義與呼叫上,lua在函式定義時可以用點也可以用冒號,如:

function mytable.fun(p)

return p

endfunction mytable:fun(p)

return p

end

用冒號定義的函式有個特別的地方是它內部有個self表示自身可以直接訪問(雖然self並不是lua的關鍵字,他它確實是可以訪問的),如同c++、c#的this:

myclass = 

function myclass:fun(p)

print(self)

print(self.age)

print(p)

endmyclass:fun("22")

輸出:

table: 00d69810

1022

可見self即myclass本身。如果上面不是冒號而是點則self不可用的會報錯,因為self是個nil值。

點定義的函式可以以冒號的形式呼叫,冒號定義的函式也可以用點的形式來呼叫,兩種方式都能成功呼叫到同一函式,但呼叫結果可能是錯誤的,上面**最後一行的冒號改為點來呼叫:

myclass.fun("22")
輸出:

22

nilnil

此時self不再是自身而是傳入的引數「22」,而本身需要的引數p卻是nil的。可見如果冒號定義的函式如果用點來呼叫時需要傳入的引數個數自動增加乙個,函式內部若有用到self則self表示的便是函式傳入的第乙個引數,第乙個引數必須傳入本身,否則最後函式執行結果會是錯誤的。上例正確的點呼叫應該是:

myclass.fun(myclass, "22")
輸出:

table: 00f298b0

1022

我們反過來試一下,先來看:

function myclass.fun(p1, p2)

print(p1)

print(p2)

endmyclass.fun("22","33")

輸出:

22

33

這個很顯然,如果呼叫改為冒號:

myclass:fun("22","33")
輸出:

table: 00e39a90

22

第乙個引數p1不是「22」卻是乙個table,第二個引數p2才是我們傳入的第乙個數「22」,可見冒號呼叫以點定義的函式時,函式的引數的意義發生了變化,第乙個引數強制變為了表示自身的變數(此時的p1等同於self),如果函式原來的引數一的意義要求不是要呼叫者將本身呼叫傳入則函式執行出錯,因此這種情況下的點定義的函式並不能用冒號來呼叫,雖然也能呼叫到該函式但結果卻是錯的。

綜上:

冒號定義成員函式相比點定義可以減少乙個需要傳入自身的引數,內部用self來訪問自身;

點呼叫冒號定義的函式時,需要多傳入乙個引數,傳入的第二個引數開始才對應於原函式的引數列表,函式內部用到的self則變為對應於傳入的第乙個引數的普通變數,故傳入的第乙個引數應該當是呼叫者自身(當然如果函式內部並沒有用到self則第乙個引數隨便傳個什麼都行);

冒號呼叫點定義的函式時,原函式的第乙個引數強制變為等同於self的變數,傳入的引數從原引數的第二個引數開始才能一一對應上,因此通常這樣呼叫都是會出錯的(除非函式內部原本就把第乙個引數在當self用...)。

故在lua中成員函式的定義應該約定一種形式而不要點和冒號同時使用,不然呼叫者可能會不清楚該函式是否支援另一種方式的呼叫而增加出錯的可能

lua中的點 冒號與self

lua程式設計中,經常遇到函式的定義和呼叫,有時候用點號呼叫,有時候用冒號呼叫,這裡簡單的說明一下原理。girl function girl.gotomarket girl somemoney girl.money girl.money somemoney endgirl.gotomarket gi...

LUA中的冒號 點和self

在lua程式設計中,經常會看到有時用點號定義乙個table的成員函式,有時卻用冒號,在呼叫的時候也是如此。那麼點號和冒號在使用上有什麼區別呢?它們與self之間又是什麼樣的關係呢?稍安勿躁,接下來謎底將一一為你揭開。下面先看乙個例子 class class.index class function ...

LUA中的冒號 點和self

在lua程式設計中,經常會看到有時用點號定義乙個table的成員函式,有時卻用冒號,在呼叫的時候也是如此。那麼點號和冒號在使用上有什麼區別呢?它們與self之間又是什麼樣的關係呢?稍安勿躁,接下來謎底將一一為你揭開。下面先看乙個例子 class class.index class function ...