1: **如下:
a = {};
function a.test()
end2: 冒號解決這個問題
a = {}
function a:test() :多了self這個機制
enda:test() 把a這個例項作為self傳遞給test函式,在test函式裡面訪問self就能獲得這個a;
3:顯示傳遞self
1: 每乙個表,可以為這個表設定乙個元表: metatable
2: 設定這個表的元表:setmetatable(table,metatable)
獲取這個表的元表:getmetatable(table)
3: 元表__index鍵
metatable中的常用鍵;
如果在表裡面找不到的key,lua直譯器在元表裡面的__index表裡進行查詢;
1: 類的表 --> 類的例項的元表:
function classa:
2: 類的例項
function classa:new(instant)
if not instant then
instant = {} --類的例項
endsetmetatable(instant, )
return instant
end3: 類的例項呼叫類的方法:
self: 繫結的例項物件;
1: 子類的表是父類的乙個例項
2: 子類的表作為乙個原型再new了乙個表;
類的例項項-->元表-->子類的表-->元表-->父類的表;
3: 現在子類的例項找,找不到到元表找,元表找不到,到元表的元表找;
4: 子類過載父類的函式;
5: 子類呼叫父類的函式;
-- self點 冒號 元素 物件導向 繼承
--self機制
-- 點號 和 冒號的區別
-- 用冒號定義的函式, 多乙個機制 self
local a = {}
function
a.test(
self,
a, b)
print(
"a.test",
self)
print(a,b)
end a.
test(a,
3, 4)
local b = {}
function
b:test(
a,b)
-- self 呼叫這個函式的表的例項
print(
"b:test",
self)
print(a,b)
end b:
test(
5,6)
--在test函式裡面 self 就是 b
--self機制要正常執行,需要有兩個點:
-- (1) 定義的函式必須使用冒號(:) 才會隱式的傳遞self
--(2)定義用冒號,使用用冒號;定義用分號,使用用分號
-- end
print(
"###################")
-- 元表
local a =
local meta_a = }
-- 元表end
--兩個表相加,第乙個引數是乙個表,第二個引數也是乙個表
-- meta_a 叫做a的元表
setmetatable(a, meta_a)
--設定表的元表
print(
getmetatable(a))
--獲取表的元表
--元表裡面有乙個重要的key: __index
-- 特點: 當我們搜尋乙個表的key的時候,如果在當前的表裡面沒有搜尋的到,
-- 那麼lua直譯器會去表的元表裡面的__index的這個key所對應的表裡面來查詢
-- 優先在自己的表裡面查詢,在沒有找到的情況下,再去元表裡面查詢
print(a.
name)
--end
print(
"###################")
-- lua物件導向
local base =
-- 成員函式
function
base:test()
print(
"base:test")
endfunction
base:new(
instant)
if not instant
then
instant = {}
endsetmetatable(instant, )
return instant
end-- 可以定義其他很多的類的函式
-- base叫做類的表
--做乙個類的例項
local b = base:
new()
-- 在new裡面把新建立的例項的表的元表變成了base
b: test()
-- test self物件就是b
-- end
-- 物件導向的幾個特點
--[[
(1)定義類的表
(2)定義乙個例項的表
(3)位這個例項的表加乙個元表,並且元表__index指向這個類的表
]] print(
"########jicheng###########")
-- 繼承 過載
--基類: person
--子類: man
local person = {}
--基類的表
function
person:test()
print(
"person:test",
self)
endfunction
person:get_age()
print(
"person:get_age",
self)
endfunction
person:new(
instant)
if not instant
then
instant = {}
endsetmetatable(instant, )
return instant
endlocal man = person:
new()
-- 子類的表
function
man:test_man()
print(
"man:test_man",
self)
endfunction
man:test_man2()
print(
"man:test_man2",
self)
endfunction
man:get_age()
--過載 覆蓋基類的test
print(
"man:get_age")
end-- 例項化乙個子類,為man類例項化乙個類的表
local p = man:
new()
--new的self裡面不在是person 而是man,
-- p的元表裡面的__index = 類的表 p:
test_man()
-- 呼叫在man類裡面找到
print(
"p=",p,
"man=",man,
"person=",person) p:
test()
-- p-->man -- >person
p: get_age()
--過載get_age
-- 繼承end 過載end
LUA中的冒號 點和self
在lua程式設計中,經常會看到有時用點號定義乙個table的成員函式,有時卻用冒號,在呼叫的時候也是如此。那麼點號和冒號在使用上有什麼區別呢?它們與self之間又是什麼樣的關係呢?稍安勿躁,接下來謎底將一一為你揭開。下面先看乙個例子 class class.index class function ...
lua中的點 冒號與self
lua程式設計中,經常遇到函式的定義和呼叫,有時候用點號呼叫,有時候用冒號呼叫,這裡簡單的說明一下原理。girl function girl.gotomarket girl somemoney girl.money girl.money somemoney endgirl.gotomarket gi...
Lua中的點 冒號與self
lua中的點 冒號與self,它們之間的關係主要體現在函式的定義與呼叫上,lua在函式定義時可以用點也可以用冒號,如 function mytable.fun p return p endfunction mytable fun p return p end用冒號定義的函式有個特別的地方是它內部有個...