游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2288

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1243|回复: 8

[蓬莱仙羽] [LUA]元表和元方法

[复制链接]  [移动端链接]
排名
826
昨日变化

34

主题

486

帖子

2686

积分

Rank: 9Rank: 9Rank: 9

UID
1261
好友
37
蛮牛币
1747
威望
0
注册时间
2013-7-31
在线时间
642 小时
最后登录
2018-8-20

专栏作家社区QQ达人认证开发者

发表于 2017-10-10 21:18:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 蓬莱仙羽 于 2017-10-10 21:21 编辑

元表作用
元表扩展普通表

举例:如果A+B两个表相加,如果不设置元表的话就会报错,这种情况就可以设置元表来实现,就类似C++的友元函数这种概念
元表设置
[AppleScript] 纯文本查看 复制代码
mymetable = {}
mytable = setmetatable({}, mymetable)

设置失败情况
当元表有_metatable键值则设置失败
tab = setmatatable({},{_metatable="sdfsd"})

如果元表设置了这个键值,则getmetatable方法只会返回这个_metatable的值,这样会保护元表使得外界获取不到并且不能修改元表


元表__index元方法
当通过键来访问table的时候,如果这个键不存在则lua会寻找该table的metatable中的__index键,如果__index包含一个table,则会在表格中查找对应的键


[AppleScript] 纯文本查看 复制代码
mytable = {"LUA","Java", "C#"}
mymetatable = {
        __index = function(tab,key)
                print(tab)
                print("调用了__index方法" .. key)
                return "Javascript"
        end
}
mytable = setmetatable(mytable, mymetatable)
print(mytable[10])


注释:key就是访问mytable的key

元方法__index还可以设置一个表格

[AppleScript] 纯文本查看 复制代码
mytable = {"LUA","Java", "C#"}
newtable = {7="javascript", 8="PHP"}
mymetatable = {
        __index = newtable
}
mytable = setmetatable(mytable, mymetatable)
print(mytable[7]) --返回javaScript 如果不存在的话则返回nil



元表__newindex元方法
__newindex添加新的数据才会起作用,如果修改已经存在的key不会起作用,他也可以设置表或者数据


[AppleScript] 纯文本查看 复制代码
mytable = {"LUA","Java", "C#"}
newtable = {7="javascript", 8="PHP"}
mymetatable = {
        --当我们修改一个不存在的key的时候才会触发
        __newindex = function(tab,key,value)
                print("我们要修改的key为"..key.."把这个key值修改为:"..value)
                rawset(tab,key,value)
        end
}
mytable = setmetatable(mytable, mymetatable)
mytable[5] = "C#"



为表添加操作符


[AppleScript] 纯文本查看 复制代码
mytable = {"LUA","Java", "C#"}
newtable = {"javascript", "PHP"}
mymetatable = {
        __add = function(tab, newtab)
        local mi = 0
        for k,v in pairs(ta) do
            if(k > mi) then
                mi = k 
            end 
        end
        for k,v in pairs(newtab) do
           mi = mi + 1
           table.insert(tab, mi, v)
        end
        return tab
    end
}
mytable = setmetatable(mytable, mymetatable)
v = mytable + newtable


还有其他操作符方法
- __add +
- __sub -
- __mul *
- __div /
- __mod %
- __eq ==
- __lt <
- __le <=


元表__call元方法
将表当做方法使用会触发__call方法


[AppleScript] 纯文本查看 复制代码
mytable = {"LUA","Java", "C#"}
newtable = {"javascript", "PHP"}
mymetatable = {
        __call = function(tab, arg) --arg可以添加无数个参数
       print(arg)
       return "aladdin"
    end
}
mytable = setmetatable(mytable, mymetatable)
v = mytable(34)
print(v)



元表中的__tostring的作用
打印table时候调用


[AppleScript] 纯文本查看 复制代码
mytable = {"LUA","Java", "C#"}
newtable = {"javascript", "PHP"}
mymetatable = {
        __tostring = function(mytable)
       local str = ""
       for k, v in pairs(mytable) do
           str = str .. v ..","
        end
    end
}
mytable = setmetatable(mytable, mymetatable)
print(mytable)







回复

使用道具 举报

7日久生情
4206/5000
排名
2647
昨日变化
16

5

主题

3111

帖子

4206

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
5
蛮牛币
5265
威望
0
注册时间
2017-3-1
在线时间
592 小时
最后登录
2018-8-20
发表于 2017-10-11 09:11:22 | 显示全部楼层
谢谢分享,学习了

回复

使用道具 举报

6蛮牛粉丝
1457/1500
排名
1328
昨日变化
2

3

主题

109

帖子

1457

积分

Rank: 6Rank: 6Rank: 6

UID
80787
好友
1
蛮牛币
1999
威望
0
注册时间
2015-3-17
在线时间
491 小时
最后登录
2018-8-20
QQ
发表于 2017-10-11 22:21:20 | 显示全部楼层
谢谢分享 学习了

回复

使用道具 举报

7日久生情
4206/5000
排名
2647
昨日变化
16

5

主题

3111

帖子

4206

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
5
蛮牛币
5265
威望
0
注册时间
2017-3-1
在线时间
592 小时
最后登录
2018-8-20
发表于 2017-10-12 09:05:31 | 显示全部楼层
Lua的学习了

回复

使用道具 举报

7日久生情
1853/5000
排名
1146
昨日变化

1

主题

232

帖子

1853

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
19402
好友
0
蛮牛币
2020
威望
0
注册时间
2014-3-28
在线时间
687 小时
最后登录
2018-8-16
QQ
发表于 2017-10-12 09:19:05 | 显示全部楼层
谢谢分享

回复

使用道具 举报

2初来乍到
126/150
排名
15556
昨日变化
8

0

主题

52

帖子

126

积分

Rank: 2Rank: 2

UID
237644
好友
0
蛮牛币
160
威望
0
注册时间
2017-8-14
在线时间
32 小时
最后登录
2017-12-12
发表于 2017-10-12 11:40:20 | 显示全部楼层
学习了,但是具体怎么用还不知道哦

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1043/1500
排名
2360
昨日变化
2

1

主题

101

帖子

1043

积分

Rank: 6Rank: 6Rank: 6

UID
132777
好友
2
蛮牛币
1181
威望
0
注册时间
2015-12-28
在线时间
389 小时
最后登录
2018-7-31
发表于 2017-10-13 16:02:18 | 显示全部楼层
好文 lua真的很好用 好用就好用在这一块
[发帖际遇]: AprilRain 乐于助人,奖励 3 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1349/1500
排名
2647
昨日变化
1

1

主题

489

帖子

1349

积分

Rank: 6Rank: 6Rank: 6

UID
220310
好友
1
蛮牛币
2304
威望
0
注册时间
2017-5-2
在线时间
359 小时
最后登录
2018-6-13
发表于 2017-10-25 14:27:13 | 显示全部楼层

回复

使用道具 举报

6蛮牛粉丝
1309/1500
排名
3036
昨日变化
12

0

主题

528

帖子

1309

积分

Rank: 6Rank: 6Rank: 6

UID
182268
好友
2
蛮牛币
654
威望
0
注册时间
2016-11-9
在线时间
339 小时
最后登录
2018-8-20
发表于 2017-10-25 17:00:12 | 显示全部楼层
啦啦啦啦啦啦啦啦啦啦
[发帖际遇]: 15910553283 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表