首页 > 代码库 > 10----元表

10----元表

元表是table预定义的一系列操作

    Lua中的每一个值都有或者可以有一个元表,但是table和userdata可以拥有独立的元表,其他类型的值就只能共享其类型所属的元素比如字符串使用~!的是string的元表

    !!! Lua在新建table的时候是不会创建metatable的,需要使用setmetatable来设置元表,setmetatable的参数可以是任意table,包括要赋值的table本身,getmetatable可以查看函数是否有元表

为了更多的展示特性,创建一个小示例,实现两个table的差集

  1. Arr={}
  2. function Arr.addTable(table1,table2) --元表里边的__add方法的重写
  3.     local ar={} --定义一个table用来盛放差集的数值
  4.     local m=1 --差集的key
  5.     --找出table1中与table2不相同的值
  6.     for i,v in ipairs(table1) do    --用循环嵌套来遍历每一个table1的值与所有table2的值的对比
  7.         local boo=true        --设置控制变量
  8.         for i1,v1 in ipairs(table2) do
  9.             if v==v1 then        --如果有值相等,那么直接退出,控制变量设置为false 即不是差集数
  10.                 boo=false
  11.                 break
  12.             end
  13.         end
  14.         if boo==true then        --如果bootrue 说明是差集数,则将它放在ar表中,key值加一
  15.             ar[m]=v
  16.             m=m+1
  17.         end
  18.     end
  19.     --找出table2中与table1不相同的值
  20.     for i,v in ipairs(table2) do    --用循环嵌套来遍历每一个table1的值与所有table2的值的对比
  21.         local boo=true        --设置控制变量
  22.         for i1,v1 in ipairs(table1) do
  23.             if v==v1 then        --如果有值相等,那么直接退出,控制变量设置为false 即不是差集数
  24.                 boo=false
  25.                 break
  26.             end
  27.         end
  28.         if boo==true then        --如果bootrue 说明是差集数,则将它放在ar表中,key值加一
  29.             ar[m]=v
  30.             m=m+1
  31.         end
  32.     end
  33.     return ar
  34. end
  35.  
  36. Arr.mt={} --元表
  37.  
  38. function Arr.new(table1) --新建一个table,table设置元表并返回
  39.     Arr.mt.__add=Arr.addTable --重写mt_add的方法为addTable
  40.     setmetatable(table1,Arr.mt) --设置table1的元表为mt
  41.     return table1
  42. end
  43.  
  44.  
  45.  
  46. --tostring
  47. function Arr.tostring(table1)
  48.     local str="差集为:{"
  49.     local stp=""
  50.     for i in ipairs (table1) do
  51.         str=str..stp..table1[i]
  52.         stp=","
  53.     end
  54.     return str.."}"
  55. end
  56.  
  57. function Arr.print(table1)
  58.     print(Arr.tostring(table1))
  59. end
  60.  
  61. --测试代码
  62. a=Arr.new({1,2,3,56,78,4})
  63. b=Arr.new({0,1,2,3,78,56,8,2,90})
  64. c=a+b
  65. Arr.print(c)
  66. --[[
  67. 得到的结果为
  68. 差集为:{4,0,8,90}
  69. --]]

10----元表