zoukankan      html  css  js  c++  java
  • 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("
    ")
        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
  • 相关阅读:
    学点 C 语言(40): 函数 多参函数
    存取 ListBox 列表 回复 "徐强" 的问题
    博客园RSS订阅汇总
    博客园电子期刊2012年2月刊发布啦
    上周热点回顾(3.53.11)
    博客园电子期刊2012年3月刊发布啦
    上周热点回顾(3.264.1)
    上周热点回顾(3.193.25)
    上周热点回顾(4.24.8)
    上周热点回顾(2.273.4)
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13779253.html
Copyright © 2011-2022 走看看