Lua metatable 与 __index方法

-----Begin of sample code-----

m1 = {xa = 70}

m2 = {x = 3, y = 4}

m3 = {}


z = {}

m1[z] = 99


m1.__index = function (t, k)

    return 1

end


setmetatable(m3,  m2)

m2.__index = m2

setmetatable(m2,  m1)


print("dump m3")

print(m3.x)

print(m3.y)

print(m3.z)

--

print("dump m2")

print(m2.x)

print(m2.y)

print(m2.z)

print(m2.xa)

--

print("dump m1")

print(m1.x)

print(m1.z)

print(m1[z])

-----End of sample code-----


Outputs:

dump m3
3
4
1
dump m2
3
4
1
1
dump m1
nil
nil
99


metatable是lua中非常重要的概念,关于上面代码输出的解释:

print(m3.x) 输出 3, m3是个空表,但其元表是m2,所以在m3中找不到x这个元素时会去m2中寻找。这个寻找是通过m2的__index方法来实现的,m2.__index 是一个table,即m2,其中包含x这个元素,所以m3.x为3. 同理m3.y 为 4.

print(m3.z) 输出 1,在m2中也不存在z这个元素,那为啥m3.z 还有值呢?因为m2是有元表的,其元表是m1,所以会去查找m1的__index方法,m1.__index是一个function,返回1。这里可以看到元表的递推特性


你可能感兴趣的:(Lua)