記錄lua的table轉string一個問題

      最近的項目開發中發現原有代碼的table2Str函數實現不對,一時偷懶從網上百度了一下。

選中了http://blog.csdn.net/xiaodan007/article/details/7096718這個地址的代碼用到了項目中。

    在項目中的使用,將table轉化爲string後,數據有丟失,追蹤,發現是這個實現有問題。

    在形如 { {aaa=1},{bbb=2}}  這樣一個table,得出的字符串總是 {{aaa=1}}

  1. ----------- 個人編寫 -----------------  
  2.   
  3. --table轉字符串(只取標準寫法,以防止因系統的遍歷次序導致ID亂序)  
  4. function sz_T2S(_t)  
  5.     local szRet = "{"  
  6.     function doT2S(_i, _v)  
  7.         if "number" == type(_i) then  
  8.             szRet = szRet .. "[" .. _i .. "] = "  
  9.             if "number" == type(_v) then  
  10.                 szRet = szRet .. _v .. ","  
  11.             elseif "string" == type(_v) then  
  12.                 szRet = szRet .. '"' .. _v .. '"' .. ","  
  13.             elseif "table" == type(_v) then  
  14.                 szRet = szRet .. sz_T2S(_v) .. ","  
  15.             else  
  16.                 szRet = szRet .. "nil,"  
  17.             end  
  18.         elseif "string" == type(_i) then  
  19.             szRet = szRet .. '["' .. _i .. '"] = '  
  20.             if "number" == type(_v) then  
  21.                 szRet = szRet .. _v .. ","  
  22.             elseif "string" == type(_v) then  
  23.                 szRet = szRet .. '"' .. _v .. '"' .. ","  
  24.             elseif "table" == type(_v) then  
  25.                 szRet = szRet .. sz_T2S(_v) .. ","  
  26.             else  
  27.                 szRet = szRet .. "nil,"  
  28.             end  
  29.         end  
  30.     end  
  31.     table.foreach(_t, doT2S)  
  32.     szRet = szRet .. "}"  
  33.     return szRet  
  34. end  

    乍一看,這個實現好像發現不出什麼問題。
    仔細分析後,明白是爲什麼了。
    doT2S這個函數雖然是在table2Str內部定義的,但它的效果和全局定義是一樣的。
    也就是說,doT2S這個函數被定義了3次。
    調用的時候分四次 1、2和3、4調用。

發佈了75 篇原創文章 · 獲贊 29 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章