lua中的元表读写理解

举个例子:lua中读写数组的方法有2种,第一种不好理解。第二种对C程序员比较好理解。

第一种:

l={100,110,120,130}

a={}


    for k,v in ipairs(l) do
        print(k,v)
       a[v] = k
    end

    print("下面是写入a表的数据,打印a表")
    for k in pairs(a) do
    print(k)
    end



输出:

>lua -e "io.stdout:setvbuf 'no'" "1.lua"
1    100
2    110
3    120
4    130
下面是写入a表的数据,打印a表
100
110
120
130


按照C数组的做法: 根据index下标值来读取和设置数组的元素。

第二种:

b = {}
for i = 1, 10 ,1 do
  b[i] = 100 + i
end


function tpstring(l)
   local a = {}
    for _,e in pairs(l) do
        print(e)
        a[#a+1] = e

    end
    print( "{" .. table.concat(a, ", ") .. "}")
end

tpstring(b);


算术类的元方法:按照第一种做法来的.


set = {}
local mt = {}

function set.new(l)
    local set = {}
    setmetatable(set,mt)  --设置set的元表为mt
    for _,v in ipairs(l) do    -- 这里的_,v 是为了ipairs遍历的时候只取v值,而忽略键值
      set[v] = true                 -- 这里将l表的v值写入到set表, 其实后面的true可以是任意值,可以改成随意的数字或者字符串,这里实际是将v作为set表的key写入的
    end
    return set
end

--求并集
function set.union(a,b)
  local res = set.new{}

   for k in pairs(a) do           -- 遍历a表,将a表的值写入res表,这里的做法是同上
      res[k] = true
   end
   for k in  pairs(b) do         -- 遍历a表,将b表的值写入res表,这里的做法是同上
      res[k] = true
   end

   return res
end

function set.tostring(set)
   local  l = {}
   for e in pairs(set) do
      l[#l + 1] = e
   end

   return "{" .. table.concat(l, ", ") .. "}"

end

function set.print(s)
   print(set.tostring(s))
end

--求交集?
function set.intersection(a,b)
   local res = set.new{}
   for k in pairs(a) do
   res[k] = b[k]
   end
   return res
end

s1 = set.new{10,20,30,50}
s2 = set.new{30,1}


mt.__add = set.union
mt.__mul = set.intersection

s3=s1+s2
s4 = s1* s2
set.print(s3)

set.print(s4)


按照第二种办法写的代码如下:


set = {}
local mt = {}

function set.new(l)
    local set = {}
    setmetatable(set,mt)
    for _,v in ipairs(l) do
      set[#set + 1] = v
    end
    return set
end

--求并集
function set.union(a,b)
  local res = set.new{}
  local bFind = false
    for i = 1, #a do
      res[#res + 1] = a[i]
   end

   for i = 1, #b do
      bFind = false
      for j = 1, #res do
         if b[i] == res[j] then
            bFind = true
            break
         end
      end

      if bFind ~= true then
         res[#res + 1] = b[i]
      end

   end


   return res
end

function set.tostring(set)
   local  l = {}
   for _,e in pairs(set) do
      l[#l + 1] = e
   end

   return "{" .. table.concat(l, ", ") .. "}"

end

function set.print(s)
   print(set.tostring(s))
end

--求交集?
function set.intersection(a,b)
   local res = set.new{}
   for i = 1, #a do
      for j = 1,#b do
         if b[j] == a[i] then
             res[#res + 1] = a[i]
         end
      end
   end

   return res

end

s1 = set.new{10,20,30,50}
s2 = set.new{30,1}


mt.__add = set.union
mt.__mul = set.intersection

s3=s1+s2

s4 = s1* s2
set.print(s3)
set.print(s4)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值