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
  • 相关阅读:
    异常:Batch update returned unexpected row count from update [0]; actual row count: 0;
    python UI/API 环境配置
    selenium xpath定位
    python webdriver 的安装与下载
    python面试题
    fiddler工具使用及手机抓包
    jmeter 常用函数
    Jmeter常用插件——Stepping Thread Group ,JMETER以及关于数据库性能分析
    Jmeter Monitor监控
    python 常用快捷键
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13779253.html
Copyright © 2011-2022 走看看