Lua从入门到放弃--元表(操作符)

今天早上看到了一个视频,内容大概是讲中国人对待中国空姐和美国空姐的态度问题(视频地址)。反正我想说的是:如果你想谈恋爱,想玩,可以选择空姐。但是如果你想结婚,千万不要选择空姐。别问我为什么,说多了都是泪。


废话不多说,这篇就让我们来看看有关元表操作符的问题。

许多元表的索引是操作符(如, +、-等),允许你使用表完成一些操作运算符。例如,我们想要一个表支持乘法操作符(*), 我们可以这样做:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值