> 最近項目中使用到了 lua,因為之前沒怎麼接觸過,特此記錄下自己在學習過程中疑惑的地方。 在使用`lua` 進行編碼的過程中,我們經常會使用到`.`和`:`,但是對於剛開始接觸`lua`的我來說,對這兩者的使用還是感到時常感到疑惑,接下來我們一起看看幾個例子,來感受兩者的區別。如果發現文中錯誤的 ...
最近項目中使用到了 lua,因為之前沒怎麼接觸過,特此記錄下自己在學習過程中疑惑的地方。
在使用lua
進行編碼的過程中,我們經常會使用到.
和:
,但是對於剛開始接觸lua
的我來說,對這兩者的使用還是感到時常感到疑惑,接下來我們一起看看幾個例子,來感受兩者的區別。如果發現文中錯誤的地方,請不吝賜教,謝謝!
1、基礎介紹
接下來,我們看看下麵的例子,來瞭解.
和:
的基礎用法。
Car = {Name="BYD", Price=12}
print("Car 的地址 --->", Car)
print(Car.Name) -- 訪問屬性
-- print(Car:Name) 報錯
print(string.rep("*", 20))
function Car:find1()
print(": 定義的函數並且使用 : 調用時 self 的地址--->", self)
end
function Car.find2()
print(". 定義的函數並且使用 . 調用時 self 的地址--->", self)
end
Car:find1()
Car.find2()
print(string.rep("*", 20))
function Car:find3()
print(": 定義的函數並且使用 . 調用時 self 的地址--->", self)
end
function Car.find4()
print(". 定義的函數並且使用 : 調用時 self 的地址--->", self)
end
Car.find3()
Car:find4()
運行結果:
Car 的地址 ---> table: 038F9CA0
BYD
********************
: 定義的函數並且使用 : 調用時 self 的地址---> table: 038F9CA0
. 定義的函數並且使用 . 調用時 self 的地址---> nil
********************
: 定義的函數並且使用 . 調用時 self 的地址---> nil
. 定義的函數並且使用 : 調用時 self 的地址---> nil
大家測試的時候,可以自己試一試。
從上面我們知道:
- 使用點號
.
來訪問 table 的屬性,不能使用:
來訪問 table 的屬性。 - 使用
.
和:
都可以用來訪問 table 的函數。 - 使用
:
定義的函數並且使用:
調用時,定義的函數中預設有一個變數self
。而不是使用:
定義的函數並且使用:
調用時,定義的函數中的是沒有self
變數的。
2、稍微深入的瞭解
通過上面的介紹,我們對 .
和:
有一個簡單的瞭解,接下我們再稍微深入的瞭解下。這裡先說結論,然後再看例子。
.
和:
的區別在於使用 :
- 使用
:
定義的函數時,函數隱含 self 參數,使用:
調用函數會自動傳入 table 至 self 參數。而使用.
定義的函數並沒有這樣。 - Lua 中使用
:
可以實現面向對象方式的調用。:
只是語法糖,它同時在方法的聲明與實現中增加了一個名為self
的隱藏參數,這個參數就是對象本身。
2.1 :
定義的函數的示例
classA={}
print("ClassA 地址 -->", classA)
function classA:getob(name)
print("classA:getob 中self 的地址 -->", self)
ob={}
setmetatable(ob,self)
self.__index=self
self.name=name
return ob
end
function classA:getself()
return self
end
c1=classA:getob("A")
print("c1 地址 -->", c1)
c2=classA:getob("B")
print("c2 地址 -->", c2)
print(string.rep("*",30))
print(c1:getself())
print(c2:getself())
print(string.rep("*",30))
----------------------繼承------------------------
classB=classA:getob() ----非常重要,用於獲取繼承的self
function classB:getob(name,address)
ob=classA:getob(name)
setmetatable(ob,self)
self.__index=self
self.address=address
return ob
end
c3=classB:getob("gray.yang","shenzhen")
print("c3 地址 -->", c3)
print(c3:getself())
運行結果:
ClassA 地址 --> table: 0392D128
classA:getob 中self 的地址 --> table: 0392D128
c1 地址 --> table: 0392D010
classA:getob 中self 的地址 --> table: 0392D128
c2 地址 --> table: 0392CE80
******************************
table: 0392D010
table: 0392CE80
******************************
classA:getob 中self 的地址 --> table: 0392D128
classA:getob 中self 的地址 --> table: 0392D128
c3 地址 --> table: 03933050
table: 03933050
2.2 .
定義的函數的示例
classA={}
print(classA)
function classA.new(cls,...) --定義類方法時使用"."號,不適用隱式傳參
print(cls)
this={}
setmetatable(this,cls)
cls.__index=cls --將元表的__index設為自身,訪問表的屬性不存在時會搜索元表
cls.init(this,...) --初始化表,註意訪問類的方法都是".",此時不會隱式傳入參數
return this
end
function classA.init(self,name)
print("classA.init -->", self)
self.name=name
end
function classA.getname(self)
print("classA.getname -->", self)
return self.name
end
-- 註意這裡的調用方式,是 : 。
p=classA:new("gray.yang")
print("p --->", p)
print(p:getname())
print(string.rep("*",50))
運行結果:
table: 0381B888
table: 0381B888
classA.init --> table: 0381B8D8
p ---> table: 0381B8D8
classA.getname --> table: 0381B8D8
gray.yang
**************************************************
熟悉其他面向語言的同學,看了上面的例子,應該對.
和:
有了瞭解,接下來自己平常多寫寫就明白了。
參考資料