Lua 實現元方法的重構

2021-10-25 07:14:22 字數 3426 閱讀 3148

最近剛剛入門lua,在學習table的時候有一些感覺很有用的思考,特此記錄分享
首先看幾個概念

表可以說是lua的核心,其他語言的一些高階資料結構可以用table來實現

最基本的陣列就是用table的方式實現的

同樣,矩陣、鍊錶、集合、佇列、包,以及物件導向程式設計等都可以使用table+方法的方式實現,具體實現過程在這裡不作展開,深入學習table建議參考官方文件

中文也推薦菜鳥教程(教程中某些地方和官方文件有一定出入,所以在這裡不作優先推薦)

我在學習lua元方法的時候思考過這樣乙個問題,既然方法可以過載,那元方法應該也可以吧?

但是常用的元方法型別都不用函式名,而一般函式的重寫還需要繼承

我覺得引入函式名這個操作會帶來bug隱患,所以作了如下嘗試,成功!

見**:

--下面是__call元方法

-- table_maxn這個方法在我使用的lua版本裡面已經不能使用了,所以需要自己定義

function

table_maxn

(t)local count =

0for k,v in

pairs

(t)do

count = count+

1end

return count

endm_table =

setmetatable(,

-- 下面是分析不同呼叫table方式的傳入引數的型別

for i=1,

3dolocal temp =

select

(i,...

)-- select(index,...) 返回第index個可變引數

-- 這個地方有些地方寫的是if index is a number, returns all arguments after argument number index,所以用的時候見仁見智

print

(type

(temp)

)end

-- switch方法的呼叫

local a =

select

("#"

,...

)-- select("#",...) 返回可變引數數量

local f = switch[a]

-- 這裡僅是將方法傳遞給f,無呼叫

-- 在這裡**參考自部落格

-- 為了使我們的switch-case結構更完整,新增default

if(f)

thenf(

)--這裡是實現主入口,注意我們每個分支都是乙個方法,所以呼叫同樣使用function的形式

else

-- for case default

print "case default."

endend})

function

main()

-- 這裡使用三種不同方式來呼叫元方法 __call

m_table(1

)-- 乙個數字

m_table()

-- 乙個表

m_table(,

)-- 兩個表

end

執行結果如下

結論是不同方法傳入的引數數量和種類不完全相同

function

table_maxn

(t)local count =

0for k,v in

pairs

(t)do

count = count+

1end

return count

endm_table =

setmetatable(,

-- 下面是分析不同呼叫table方式的傳入引數的型別

for i=1,

3dolocal temp =

select

(i,...

)-- select(index,...) 返回第index個可變引數

-- 這個地方有些地方寫的是if index is a number, returns all arguments after argument number index,所以用的時候見仁見智

print

(type

(temp)

)end

-- switch方法的呼叫

local a =

select

("#"

,...

)-- select("#",...) 返回可變引數數量

local f = switch[a]

-- 這裡僅是將方法傳遞給f,無呼叫

-- 在這裡**參考自部落格

-- 為了使我們的switch-case結構更完整,新增default

if(f)

thenf(

)--這裡是實現主入口,注意我們每個分支都是乙個方法,所以呼叫同樣使用function的形式

else

-- for case default

print "case default."

endend})

function

main()

table2 =

m_table = m_table + table2 -- __add元方法

print

(m_table)

--列印table的元方法

print"--------------------------------------------"

for i=1,

20do

print

(m_table[i]

)end

print"--------------------------------------------"

m_table[11]

=11 m_table[12]

=12for i=1,

20do

print

(m_table[i]

)end

print"--------------------------------------------"

-- 這裡使用三種不同方式來呼叫元方法 __call

m_table(1

)-- 乙個數字

m_table()

-- 乙個表

m_table(,

)-- 兩個表

endmain()

--呼叫main()

上面只是提供了乙個引數數量不同而進行過載的思路,如果需要識別引數類別的過載還需要新增方法實現。

Lua繼承的實現( index元方法)

通過lua強大的metatable來實現繼承,主要 如下 index元方法 用於檢視表中元素或方法是否存在,如果不存在返回nil,如果存在,則返回 index表中的結果 baseclass baseclass.index baseclass function baseclass myshow key...

Lua 元表以及元方法

例如 a 10b 20print a b 我們可以得到30,但是如果兩個table型別相加呢?a b print a b 輸出結果是 lua hello world.lua 3 attempt to perform arithmetic on global a a table value stack...

lua元表與元方法

1.首先我們先了解下lua的表 2.元表 是用來定義對table操作的方式表 我們先來看一下問題 t1 t2 我們把這兩張錶拼起來 第一種方法 table.inster t1,t2 1 第二種方法 元表 mt 方法類似於c 的運算子過載可以看出我們過載的是 mt.add function t1,t2...