一、tostring方法官方释义
Receives a value of any type and converts it to a string in a human-readable format.
If the metatable of v has a __tostring field, then tostring calls the corresponding value with v as argument, and uses the result of the call as its result. Otherwise, if the metatable of v has a __name field with a string value, tostring may use that string in its final result.
– Lua5.4 Reference Manual
当调用tostring方法,或使用print打印一个对象时(print函数总会调用tostring方法来格式化输出,其实还是调用tostring方法),如果元表有__tostring键,则执行__tostring键对应的方法,如果没有则看元表有没有__name键,返回__name键对应的字符串,修改表的输出逻辑
二、__tostring键
元表有__tostring键,执行__tostring键对应的方法
local a = {"2"}
a.__tostring = function(t)
print("111111a")
print(t[1])
return "a"
end
local b = {"3"}
b.__tostring = function(t)
print("111111b")
print(t[1])
return "__tostring b"
end
setmetatable(a, b)
print(a)
注:__tostring需要是一个方法,字段的话会直接报错
local a = {"2"}
a.__tostring = function(t)
print("111111a")
print(t[1])
return "a"
end
a.__name = "a"
local b = {"3"}
b.__tostring = "111111 tostring b"
setmetatable(a, b)
print(a)
三、__name键
元表没有__tostring键,有__name键,返回__name键对应的字符串
local a = {"2"}
a.__tostring = function(t)
print("111111a")
print(t[1])
return "a"
end
a.__name = "a"
local b = {"3"}
--b.__tostring = function(t)
-- print("111111b")
-- print(t[1])
-- return "__tostring b"
--end
b.__name = "__name b"
setmetatable(a, b)
print(a)
注:__name键对应的需要是字符串,否则将不被调用
local a = {"2"}
a.__tostring = function(t)
print("111111a")
print(t[1])
return "a"
end
a.__name = "a"
local b = {"3"}
--b.__tostring = function(t)
-- print("111111b")
-- print(t[1])
-- return "__tostring b"
--end
--b.__name = "__name b"
b.__name = function(t)
print("111111b name")
return "__name b"
end
setmetatable(a, b)
print(a)