lyh916

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

参考链接:

https://www.runoob.com/lua/lua-metatables.html

https://www.jianshu.com/p/cb945e7073a3

 

元表是一个table,可以让我们改变table的行为,每个行为有对应的元方法

例如,对table进行设置键值,查找键值,运算等,就会触发对应的元方法

 1 --__index:table被访问时,如果找不到这个键,就会触发元表的__index元方法;类似get
 2 function TestMetatableIndex()
 3     --__index的值为table,在table中找
 4     local a = {k1 = "hello"}
 5     setmetatable(a, {
 6         __index = {k1 = "hello2", k2 = "hi"}
 7     })
 8     print(a.k1, a.k2) --hello   hi
 9 
10     --__index的值为方法
11     local b = {}
12     setmetatable(b, {
13         __index = function (mytable, key)
14             return "qwe" .. key 
15         end
16     })
17     print(b[1]) --qwe1
18 end
19 
20 --__newindex:table被设置值时,如果找不到这个键,就会触发元表的__newindex元方法;类似set
21 function TestMetatableNewindex()
22     --__newindex的值为table,给该table设置值
23     local a = {}
24     local b = {}
25     setmetatable(a, {
26         __newindex = b
27     })
28     a.k1 = "asd"
29     print(a.k1, b.k1) --nil asd
30 
31     --__newindex的值为方法
32     local c = {}
33     setmetatable(c, {
34         __newindex = function (t, key, value)
35             print(key .. "_" .. value)
36         end
37     })
38     c[1] = "zxc" --1_zxc
39 end
40 
41 --__add:table被相加时,会触发该元方法
42 --两表相加,必须至少其中一个表设置了带__add键的元表
43 --如果两个表都设置了带__add键的元表,则程序会去执行"+"左侧的表中的元表的__add
44 function TestMetatableAdd()
45     local a = {1, 2, 3}
46     local b = {4, 5, 6}
47     setmetatable(b, {
48         __add = function (t1, t2)
49             local result = {}
50             for i=1,3 do
51                 result[i] = t1[i] + t2[i]
52             end
53             return result
54         end
55     })
56     local c = a + b
57     for k,v in pairs(c) do
58         print(k,v)
59     end
60     --打印:
61     --1 5
62     --2 7
63     --3 9
64 end
65 
66 --__call:table被调用时(像调用方法一样),会触发该元方法
67 function TestMetatableCall()
68     local a = setmetatable({10}, {
69         __call = function(t, b, c, d) --table会作为第一个参数,其他的为传入的参数
70             print(t[1], b, c, d) --10   2   5   nil
71             return 30, 40
72         end
73     })
74     print(a(2,5)) --30  40
75 end
76 
77 --__tostring:table被打印时,会触发该元方法
78 function TestMetatableTostring()
79     local a = setmetatable({10}, {
80         __tostring = function(t)
81             return "hello" .. t[1]
82         end
83     })
84     print(a) --hello10
85 end
86 
87 -- TestMetatableIndex()
88 -- TestMetatableNewindex()
89 -- TestMetatableAdd()
90 -- TestMetatableCall()
91 -- TestMetatableTostring()

其他运算符:

posted on 2022-02-20 13:37  艰苦奋斗中  阅读(98)  评论(0编辑  收藏  举报