在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在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() 这样就可以实现对运算符的一个简单重载,可以重载的方法还有很多,比如 __add: 对+进行重载 __sub: 对-进行重载 __mul: 对*进行重载 __div: 对/进行重载 __unm: 对相反数进行重载 __mod: 对%进行重载 __pow: 对^进行重载 __concat: 对连接操作符进行重载 __eq: 对==进行重载 __lt: 对<进行重载 __le: 对<=进行重载 __tostring: 类似于C++中对<<的重载 只要做了该重载,在使用print时就会使用对应的函数做处理后再输出
|
请发表评论