lua的元表是表的乙個擴充套件,可以簡化表的一些操作。setmetatable
關鍵字是設定元表的核心操作。
__index
相當於建立索引,為查詢表元素提供了方便。
lua 查詢乙個表元素時的規則,其實就是如下 3 個步驟: (參考自
在表中查詢,如果找到,返回該元素,找不到則繼續
判斷該錶是否有元表,如果沒有元表,返回 nil,有元表則繼續。
判斷元表有沒有 __index 方法,如果 __index 方法為 nil,則返回 nil;如果 __index 方法是乙個表,則重複 1、2、3;
如果 __index 方法是乙個函式,則返回該函式的返回值,table和鍵會作為引數傳遞給函式。
給出**例項:
other =
t = setmetatable({}, )
print(t.foo)
mytable = setmetatable(, )
print(mytable.key1)
print(mytable.key2)
函式的輸出是:
3
key2
metatablevalue
可以給表新增操作符號,以__add
為例子:
function table_maxn(t)
local mn = 0
for k, v in pairs(t) do
if mn < k then
mn = k
endend
return mn
endmytable = setmetatable(, )
secondtable =
mytable = mytable + secondtable
for k, v in ipairs(mytable) do
print(k, v)
end
同樣的,函式以mytable
和`操作符後面的表作為輸入。還有其他的操作符號,可以查詢對應的表資料。
__call
方法在lua呼叫乙個值時進行呼叫,給出**例項:
function table_maxn(tb)
local mn = 0
for k, v in pairs(tb) do
if k > mn then
mn = k
endend
return mn
endmytable = setmetatable(, )
newtable =
print(mytable(newtable)) -- 輸出21
相當於乙個元表本身就是乙個函式了。
__tostring
用於改變元素的輸出方式,**例項:
mytable = setmetatable(, )
print(mytable) -- 輸出60
新建乙個module1
的模組,命名為model1.lua
module1 = {}
module1.constant = "this is constant"
function module1.func1()
print("public function")
endlocal function func2()
print("this is a private function")
endfunction module1.func3()
func2()
endreturn module1
新建main.lua
檔案,內容如下:
local m = require("./module1")
print(module1.constant) -- 報名呼叫
m.func1() -- 變數呼叫
module1.func3()
local path = "/usr/local/lua/lib/mylua.so"
local f = loadlib(path, "luaopen_socket")
lua中,乙個類使用table表示的,同時還需要借助元表的技術,給出**例項:
rectangle =
function rectangle:new (o, width, height)
o = o or {}
setmetatable(o, self) -- 通過元表的方式,來確定新物件,也可以進行引用操作
self.__index = self
self.width = width or 0
self.height = height or 0
return o
endfunction rectangle: area ()
return self.width * self.height
endrect = rectangle:new(nil, 10, 20) -- 新建物件
print(rect:area()) -- 200
rect1 = rectangle:new(rect1, 20, 30) -- 傳遞物件的引用,同時改變對應的值
print(rect:area()) -- 600
print(rect1:area()) -- 600
print(rect.width) -- 20
PHP物件導向和面向過程 崔元欣
程式設計界不論是php python都有這麼兩種程式設計思想,oop物件導向 pop面向過程,這兩種在功能上沒有多大區別,但是在 編寫上卻有很大區別。今天就記錄一下物件導向和面向過程的優點 缺點 定義 實現過程。oop 物件導向 物件導向有兩個重要的概念 類和物件。什麼是類?類是具備某項功能的抽象模...
鍊錶,順序表和物件導向程式設計
1.線性表 n給具有相同特性資料元素的集合 2.順序表 是用一段實體地址連續的儲存單元依次儲存資料元素的線性結構,一般情況下採用陣列儲存。優點 空間連續,支援隨機訪問 缺點 中間或前面部分的插入刪除時間複雜度o n 2.增容的代價比較大 優點 1.任意為止地插入刪除時間複雜度為o 1 2.沒有增容問...
re模組和物件導向day16
compile 正規表示式 編譯正規表示式,建立正規表示式物件1 fullmatch 正規表示式,字串 讓整個字串和正常則表示式進行匹配 2 match 正規表示式,字串 匹配字串開頭 如果匹配不到結果是none,如果匹配成功了,結果是匹配物件re str r d result match re s...