最近專案中使用到了 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
**************************************************
熟悉其他面向語言的同學,看了上面的例子,應該對.和:有了了解,接下來自己平常多寫寫就明白了,
參考資料
Lua 面向物件
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555346.html
標籤:其他
下一篇:返回列表
