lua的點和冒號的區別


lua的語法很簡單,太簡單了,所以lua就復雜了

兩個點與一個點有什么區別呢?

一個點用來定義和取得一個變量,這個變量可能是個函數

兩個點用來定義和調用一個函數,兩個點會自動傳入“調用者”這個table自身

先看簡單的:

c = {a = 1, b = 2}

function c:foo()

  print(self.a,self.b)

end

這里,c這個table定義了一個foo函數,用兩個點定義的,在foo函數第一個參數的地方自動傳入了c自身,然后調用一下

c:foo()

輸出1 2

也可以這樣,一個點調用函數,手動傳入table:c.foo(c)

輸出也是一樣的

 

下面看復雜一點的:

兩個點會自動傳入調用者本身,但是他僅僅只會傳入調用者本身,他沒有一個點靈活,這個怎么理解?看代碼

c = {a = 1, b = 2}

c.foo = function(c) print(c.a,c.b) end

d = {}

d.foo2 = c.foo

d:foo2()

輸出為:nil nil

解釋下上面的代碼:

首先創建一個table,然后定義一個函數foo,這個函數訪問了table中的a和b兩個變量

然后創建了另一個table,b

在b中定義一個變量foo2,賦值為c這個table中的foo函數

然后調用d這個table中的foo2函數,輸出為nil nil

因為d是兩個點調用的foo2,那么會自動吧d本身傳入函數的第一個參數,那么函數的運行就是這樣的:

function (d)

  print(d.a,d.b)

end

d這個table沒有定義a和b兩個變量,輸入當然就是nil

 

像這種情況就只能一個點調用,顯示的傳入c這個table

d:foo2()改為d.foo2(c) 這樣就可以了

輸出1 2

 

上面的例子還可以這么寫:

c = {a=1,b=2}
function c:foo()
  print(self.a,self.b)
end

d = {}
d.foo2 = c.foo

d.foo2(c)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM