一、定義方法的區別
1、冒號定義方法,默認會接受self參數;而點號定義的時候,默認不會接受self參數
例:
(1)冒號定義
function class:test()
--這里會接受self參數,比如
print(self.a,self.b)
在這里self就是class對象本身,因此不會出錯
end
(2)點號定義
function class.test()
--點號定義時,默認不會接受self參數,因此在這里用self會出錯,找不到全局變量self,當然如果你把self定義成了一個全局變量的話。。。那么你贏了。。
print(self.a,self.b)--報錯,找不到全局變量self
end
二、調用方法的區別
1、冒號調用方法,會默認地將對象本身(self)傳遞給方法;而點號調用則不會
例1:冒號定義
function class:test()
print(self.a,self.b)
end
(1)冒號調用:class:test(),這時候在test方法是可以使用self的,因為默認會將self傳遞給test方法
(2)點號調用:class.test(),這時候在test方法中使用self就會報錯了,因為self並沒有被傳遞給test方法,那么要怎么在test方法中使用self呢?其實也簡單,把class對象傳遞過去就好了,如:class.test(class)
例2:點號定義
function class.test()
print(self.a,self.b)
end
(1)冒號調用:class:test(),這時會報錯,這里雖然冒號調用會把self傳遞過去,但是點號定義方法不接受self啊,所以會報錯。想要用就只能顯式地接受參數了,方法重新定義一下:function class.test(self) print(self.a) end
這樣,冒號調用的時候默認把對象本身傳遞給方法了,方法也接受了這個參數,這就對了,參數self的名字可以改變,function class.test(tt) print(tt.a,tt.b) end
(2)點號調用:class.test(),定義的時候沒有接受參數,調用的時候又沒有傳遞參數。。能成功才怪!
直接說正確方法吧:就是傳什么參數就用什么參數唄。。反正沒有默認參數
定義的時候,顯式地接受參數
function class.test(tt)
print(tt.a,tt.b)
end
class.test(class)
