最近剛剛入門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...