至 LuaJIT-2.0.4 为止,tostring() 函数都只会检查并调用元表的 __tostring 函数。那么在面向对象式开发时,如何让基类定义地统一 __tostring 机制生效?
print(setmetatable({
__tostring = function ( self )
return '3'
end
}, setmetatable({
__tostring = function ( self )
return '2'
end
}, {
__tostring = function ( self )
return '1'
end
})))
在上面的案例中,输出内容是 2。如果将该函数定义删除,输出内容就变成了 table: 0x01c773b8 这样的值。
转以面向对象的思维来理解,3 是类的实例,2 是类,1 是父类。
因此为了能够使用本基类统一的 __tostring 方法,在定义每个派生类时,都需要显性地定义派生类中的方法,使其能逐层递归调用至基类。