lua 算術類和關係類的元方法

2021-07-07 01:58:28 字數 1455 閱讀 3950

1.算術類的原方法

下面是乙個關於交集和並集的例子

set = {}

--根據引數列表中的值建立乙個新的集合

function set.new(l)

local set = {}

for _, v in ipairs(l) do

set[v] = true

endreturn set

endfunction set.union(a,b)

local res = set.new{}

for k in pairs(a) do res[k] =true end

for k in pairs(b) do res[k] = true end

return res

endfunction set.intersection(a,b)

local res = set.new{}

for k in pairs(a) do

res[k] = b[k]

endreturn res

endfunction set.tostring(set)

local l = {} --用於存放集合中所有元素的列表

for e in pairs(set) do

l[#l +1] = e

endreturn ""

endfunction set.print(s)

print(set.tostring(s))

endmt.__add = set.union

這樣,只要lua試圖將兩個集合相加,它就會呼叫set.union函式,並將兩個運算元作為引數傳入。可以使用加號來求集合的並集

s1 = set.new

s2 = set.new

s3 = s1+s2

set.print(s3) -->

類似的,還可以使用乘號來求集合的交集

mt.__mul = set.intersection

set.print((s1+s2)*s1) -->

元表中的數字操作符:

__sub(減法),__div(除法),__unm(相反數),__mod(取模),__pow(乘冪),__concat(連線)

2.關係類的元方法

元表還可以指定關係操作符的含義,元方法為__eq(等於),__lt(小於),__le(小於等於)

mt.__le = function(a,b)

for k in pairs(a) do

if not b[k] then return false end

endreturn true

endmt.__lt = function(a,b)

return a<=b and not (b<=a)

endmt.__eq = function(a,b)

return a<=b and b<=a

end與算術類的元方法不同的是,關係類的元方法不能應用於混合型別

lua算術運算和關係運算metamethods

說明1.以下使用的metamethod都是lua核心metamethod,使用的時候可以採用相應的操作符,如 add可以解釋成 2.metamethod需要放在metatable中使用 算術運算子對應的域 add sub mul div unm 負 pow 冪 關係運算子對應的域 eq lt le ...

lua 算術運算子對應的元方法

pow 冪運算 band 按位與 bor 按位或 bxor 按位異或 bnot 按位取反 shl 向左移位 shr 向右移位 len 取長度 此外還有 tostring 可以影響對這個型別的數值的print結果。不過一般我們都是給表或者自定義型別設定元表和元方法,其實其他型別值也可以,不過得通過c ...

類和類之間的關係

在uml中,類和類之間有實現 介面 繼承等等。下面重點講下下面四個的區別 一般來講,關聯是指一種一對一的關係。注意,在關聯中,關聯物件擁有被關聯類 以箭頭指向來說 水平的引用 class asset class player set the asset via constructor or a se...