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)