記一個全局變量"冒充"局部變量引發的bug

看代碼至關簡單直觀,以爲怎麼都不會出錯,可運行結果明明就是錯了 - 對着vim摸着腦殼就是想不出哪裏有問題,可去掉新加的代碼,就又能夠了。vim

沒辦法,只好祭出殺手鐗:一行一行註釋掉來觀察。。。函數

反映問題的代碼段至關簡單:spa

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的啊,管我怎麼改對全局都不會有影響。code

當註釋掉這一行試了一下發現能夠以後,帶着難以想象的心情,檢查起來,而後去看create_object()這個函數:blog

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。。。it

這裏爲了提升效率,把處理過的東西cache起來了,create_object只要是相同的輸入,返回的都是同一個object。。。io

相關文章
相關標籤/搜索