看程式碼相當簡單直觀,覺得怎麼都不會出錯,可執行結果明明就是錯了 - 對著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。。。