lua之元表

arr={}
mt={}
--设置arr的元表为mt
setmetatable(arr,mt)
print(arr)
print(mt)
print(getmetatable(arr))

有了元表,接下来看操作:

如果想要通过索引查找arr里面的值,但是arr里面没有对应的索引,比如:

arr={}
other={x=100}
mt=
{
    __index=other 
    --如果arr里面没有对应的索引,那么会到他的元表中来查找对应的索引。

}
--设置arr的元表为mt
setmetatable(arr,mt)
print(arr)
print(mt)
print(getmetatable(arr))

print(arr.x)

 

如果索引在元表里面:

arr={}

mt=
{
    __index=function(k,i) --k,i相当于arr和mt
      if i=="x" then
      print("i==x")
    elseif i=="y" then
        print("i==y")
    else
        print("i is error")
      end 
    end
}

setmetatable(arr,mt)
print(arr.x)

 

 

元方法示例测试:

a={1,2,3}
b={2,5,6}

c={1,2,3}

mt={}

--相当于C++的运算符重载

--重载加法
mt.__add=function(a,b)
    local count=#a
    local res={}
    for i=1,count do
        res[i]=a[i]+b[i]
    end
    return res
end

--重载减法
mt.__sub=function(a,b)
    local count=#a
    local res={}
    for i=1,count do
        res[i]=a[i]-b[i]
    end
    return res
end

--重载乘法
mt.__mul=function(a,b)
    local count=#a
    local res={}
    for i=1,count do
        res[i]=a[i]*b[i]
    end
    return res
end

--重载除法
mt.__div=function(a,b)
    local count=#a
    local res={}
    for i=1,count do
        res[i]=a[i]/b[i]
    end
    return res
end

--重载等于
mt.__eq=function(a,b)
    local count=#a
    for i=1,count do
        if a[i]==b[i] then
            goto END
            else
                return false
        end
        ::END::
    end    
return true
end

--设置原方法
setmetatable(a,mt)
setmetatable(b,mt)
setmetatable(c,mt)

--遍历所有元素函数
traverse=function(x)
    local count=#x
    for i=1,count do
    io.write(x[i]," ")
    end
    io.write("\n")
    return x
end

local result_one=a+b
local result_two=a-b
local result_three=a*b
local result_four=a/b
traverse(result_one)
traverse(result_two)
traverse(result_three)
traverse(result_four)


if a==c then
print("a is equal c")
else 
    print("a is not equal c")
end

if a==b then
print("a is equal b")
else 
    print("a is not equal b")
end

 

posted @ 2020-10-07 21:02  sunshine_gzw  阅读(143)  评论(0编辑  收藏  举报