今天早上看到了一个视频,内容大概是讲中国人对待中国空姐和美国空姐的态度问题(视频地址)。反正我想说的是:如果你想谈恋爱,想玩,可以选择空姐。但是如果你想结婚,千万不要选择空姐。别问我为什么,说多了都是泪。
废话不多说,这篇就让我们来看看有关元表操作符的问题。
许多元表的索引是操作符(如, +、-等),允许你使用表完成一些操作运算符。例如,我们想要一个表支持乘法操作符(*), 我们可以这样做:
t = setmetatable({1, 2, 3}, {
__mul = function(t, other)
local new = {}
for i = 1, other do
for _, v in ipairs(t) do
table.insert(new, v)
end
end
return new
end
})
t = t * 2 -- {1, 2, 3, 1, 2, 3} 当调用乘法运算符时, 此时会调入__mul函数, t = {1, 2, 3}, other = 2,运行函数得到new = {1, 2, 3, 1, 2, 3}
这允许我们创建一个使用乘法操作符重复某些次数的新表,__mul和乘法相当的索引是与之前讲的__index、__newindex不同,操作符索引只能是函数,而不能是表。它们接受的第一个参数是目标表,接着是右值(除了一元操作符"-", 即索引__unm)。下面是操作符列表,这里只是简单列举出来,不再一一作说明,可参考上面的例子自己尝试改写,如果有问题欢迎留言:
__add:加法(+)
__sub:减法(-)
__mul:乘法(*)
__div:除法(/)
__mod:取模(%)
__unm:取反(-), 一元操作符
__concat:连接(..)
__len:取长度(#)
__eq:等于(==)
__lt:小于(<)
__le:小于等于(<=)
注:(只有==, < , <=, 因为你能通过上面的实现所有操作符, 事实上== 和 < 就足够了)
__call
接下来讲讲__call索引, 它允许你把表当函数调用,例如:
t = setmetatable({}, {
__call = function(t, a, b, c, whatever)
return (a + b + c) * whatever
end
})
t(1, 2, 3, 4) -- 24, 表t在调用时先查找__call, 调用里面的函数, 此时a = 1, b = 2, c = 3, whatever = 4
__call非常有用, 经常用来在表和它里面的函数之间转发调用。
__tostring
如果想实现__tostring, 那么tostring可以把表转换为string, 非常方便类似print的函数使用。一般情况下, 当你把表转为string时, 你需要"table: 0x < hex - code -here", 但是你可以仅用__tostring来解决,例:
t = setmetatable({1, 2, 3}, {
__tostring = function(t)
local sum = 0
for _, v in pairs(t) do
sum = sum + v
end
return "Sum: " .. sum
end
})
print(type(t), t) -- prints out --> table "Sum: 6"
下一篇给大家写一个打印表的demo,以后会尽量将博客写的有趣一点,会在文章开始的时候将一些小段子或者自己生活中发生的有趣的事。
本文参考lua手册 http://www.lua.org/manual/5.3/manual.html