做个学习记录,也供其他人参考,请大佬点评。[Lua] 纯文本查看 复制代码 --前面省略
function myUnit:__tostring()--重写原方法的逻辑
local str=string.format("名字:%s 等级:%d 血量:%d/%d 蓝量:%d/%d",self.name,self.lv,self.hp,self.maxHp,self.mp,self.maxMp)
return str
end
local me=myUnit:New("player")
local tar=myUnit:New("target")
print(me)
打印的结果会是这样:名字:xiaoyao1 等级:85 血量:105823/105823 蓝量:100/100
看到这里有点迷糊,如果没有myUnit:__tostring()这个function,那打印结果将会是这种形式:table: 33DFBEB0。好像没见这个调用myUnit:__tostring()?为什么这里打印会是这个结果
好吧,经各种查资料,加上我七零八落粗浅拼凑的理解,我觉得是这样:使用print打印一个对象时,print函数总会调用tostring方法来格式化输出。如果元表有__tostring键,则执行__tostring键对应的方法,如果没有则看元表有没有__name键,返回__name键对应的字符串,修改表的输出逻辑。
这话如何理解呢,用print就会调用tostring方法,本来tostring就是做格式转化,把不是字符串的数据转化为字符串,如果是表格,就做了个不懂的递归处理,就是根据表格的数据,输出成table: 33DFBEB0这种格式。那现在,在此脚本里(能说是chunk吗),给了个__tostring的方法,就会优先使用这个方法,只要有这些数据,那就会输出这种格式的字符串来。
那至于print这个函数是啥样呢,调用了哪些方法?print是Lua 的内置函数并没有开源,因为它是 Lua 解释器的一部分,不是用 Lua 编写的,如果真要看,就要去看Lua的源码,我是没去看,有同学看了可以告诉我。
到这里,想必是可以回答以上的问题了。
|