首页 > 其他 > 详细

在Lua中进行运算符重载

时间:2014-07-03 10:17:16      阅读:748      评论:0      收藏:0      [点我收藏+]

在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时就会使用对应的函数做处理后再输出

 

在Lua中进行运算符重载,布布扣,bubuko.com

在Lua中进行运算符重载

原文:http://www.cnblogs.com/coder-zhang/p/3818226.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!