lua的元表 模組和物件導向

2021-09-26 03:22:24 字數 2848 閱讀 3266

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...