开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1908

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

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

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

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

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

26

主题

443

帖子

2379

积分

Rank: 9Rank: 9Rank: 9

UID
1261
好友
35
蛮牛币
906
威望
0
注册时间
2013-7-31
在线时间
529 小时
最后登录
2017-10-23

专栏作家社区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日久生情
1975/5000
排名
6332
昨日变化
48

4

主题

1622

帖子

1975

积分

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

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

回复

使用道具 举报

5熟悉之中
952/1000
排名
1923
昨日变化
12

2

主题

78

帖子

952

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1975/5000
排名
6332
昨日变化
48

4

主题

1622

帖子

1975

积分

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

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

回复

使用道具 举报

6蛮牛粉丝
1299/1500
排名
1583
昨日变化

1

主题

157

帖子

1299

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

2初来乍到
116/150
排名
14137
昨日变化
11

0

主题

53

帖子

116

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

5熟悉之中
957/1000
排名
2195
昨日变化
9

1

主题

92

帖子

957

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

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

本版积分规则

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