记一个全局变量"冒充"局部变量引起的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。。。

 

 

posted @ 2013-07-18 21:04 lzprgmr 阅读(...) 评论(...) 编辑 收藏

黄将军