setmetatable和__call

326 词

作者:糖果

网上找来一个很能说明__call用法的例子:

function f(tb, x, y)
    for k,v in pairs(tb) do
        print(k,v)
    end
    return x+y+tb.n
end

b = {}
b.__call = f


a = {}
function a:test()
end
a.n = 100
a.m = 200
setmetatable(a,b)
print(a(1,2))

b作为a的元表的时候,table b={}的表函数,使用__call提定的话,
在执行a(惨数列表), 参数列表和b的f函数的参数列表一致, 被指定函数的第一个参数,是一个table,里面存放的是a的成员变量和函数。

如果这种效果要有C来实现的话,要指向来指向去的指针实现。