记一个全局变量"冒充"局部变量引起的bug
看代码相当简单直观,觉得怎么都不会出错,可运行结果明明就是错了 - 对着vim摸着脑袋就是想不出哪里有问题,可去掉新加的代码,就又可以了。
没办法,只好祭出杀手锏:一行一行注释掉来观察。。。
反映问题的代码段相当简单:
if condition then local v = create_object(mpr) if condition2 then v.R = "fixedR" end return v.MP .. v.R end
被影响的是和v同类的一些object,可是这个代码里怎么看都没问题,v是被我改了,可那是local的啊,管我怎么改对全局都不会有影响。
当注释掉这一行试了一下发现可以之后,带着不可思议的心情,检查起来,然后去看create_object()这个函数:
object_cache = {} function create_object(mpr) if object_cache[mpr] then return object_cache[mpr] end local obj = split(mpr) object_cache[mpr] = obj return obj end
原来我改的东西,不是local的,而是全局的,放在一张全局表的cache。。。
这里为了提高效率,把处理过的东西cache起来了,create_object只要是相同的输入,返回的都是同一个object。。。