• 在Lua中进行运算符重载


    在C++里面运算符是可以重载的,这一点也是C++比较方便的一个地方。在Lua中其实也是可以模拟出运算符的重载的。

    在Lua中table中元素的运算都是和一个叫做元表有关的,在一个table型的变量上都有一个元表,在元表中存放着该变量的

    元函数,在进行运算是,就是利用元表中的这些元函数进行的,比如对两个元素进行加法操作,实际上就是调用在元表中

    的一个元函数__add()来实现的。所以通过对这种情况的了解,我们可以很方便的对table元素的元表进行重新的设定,

    从而实现重载运算符的目的。

    并且table可以用来模拟非常多的数据结构,这样就使得Lua的重载可以发挥出非常强大的实力。

    下面以定义一个集合类型为例来演示Lua 1 Set = { 2 ops = {}

     3 
     4 function  Set.new (data)
     5     local set = {}
     6     setmetatable(set, ops)
     7     for _, value in ipairs(data) do set[value] = true end
     8     return set    
     9 end
    10 
    11 function  Set.union (a, b)
    12     local set = {}
    13     for k in ipairs(a) do set[k] = true end
    14     for k in ipairs(b) do set[k] = true end
    15     return set
    16 end
    17 
    18 function  Set.tostring(set)
    19     local l = {}
    20     for e in pairs(set) do
    21         l[#l + 1] = e
    22     end
    23     return  "{" .. table.concat(l, ", ") .. "}"
    24 end
    25 
    26 function  Set.equal (a, b)
    27     for k in ipairs(a) do
    28         if not b[k] then
    29             return false
    30         end
    31     end
    32     return true
    33 end
    34 
    35 function  override()
    36     ops.__add = Set.union
    37     ops.__tostring = Set.tostring
    38     ops.__eq = Set.equal
    39 end
    40 override()
    41 s1 = Set.new ({10, 20, 30, 40, 50}) 42 s2 = Set.new ({10, 20, 30, 40, 50}) 43 44 s3 = s1 + s2 45 46 print (s3) 47 48 if s1 == s2 then 49 print ("s1 == s2") 50 else 51 print ("s1 ~= s2") 52 end

    这样就可以实现对运算符的一个简单重载,可以重载的方法还有很多,比如

    __add: 对+进行重载

    __sub: 对-进行重载

    __mul: 对*进行重载

    __div: 对/进行重载

    __unm: 对相反数进行重载

    __mod: 对%进行重载

    __pow: 对^进行重载

    __concat: 对连接操作符进行重载

    __eq: 对==进行重载

    __lt: 对<进行重载

    __le: 对<=进行重载

    __tostring: 类似于C++中对<<的重载 只要做了该重载,在使用print时就会使用对应的函数做处理后再输出

  • 相关阅读:
    psp4
    一维循环数组最大子数组求解
    psp3
    psp2
    求二维数组最大连续子数组
    计算连续最大子数组问题
    psp1
    关于30道题目问题
    Java 文件操作
    java iterator
  • 原文地址:https://www.cnblogs.com/coder-zhang/p/3818226.html
Copyright © 2020-2023  润新知