2016-11-28 60 views
-1

三個循環但結果不同,爲什麼? (在LUA 5.1)更改lua表值時?

1.

local a = {{b=5}, {b=4}} 
for k,v in ipairs(a) do 
    v.b = v.b + 1 
end 

2.

local a = {["b"]=5, ["bb"]=4} 
for k,v in pairs(a) do 
    v = v + 1 
end 

3.

local a = {5, 4} 
for k,v in ipairs(a) do 
    v = v + 1 
end 
  • 真正增加1到表中的所有元素,但 & 改變什麼。 爲什麼?
  • 我使用chunkspy看到這些三個塊的操作碼發現,在第一嵌段它具有可設定的運算改變表中的值之後,但阻止或沒有。 Block & just do add 5 5 261; 1(意味着將1添加到註冊5,但不會將值保存到表),爲什麼會發生這種情況?
+6

因爲'v'是循環內存在的一個簡單的局部變量。修改'v'本身不會修改表中的數據。 –

回答

1

這裏的問題在於vk,v對中,是對值的引用,而不是密鑰。

這意味着,v=只是修改局部變量v並且不影響表本身。你可以,而不是a[k]=v+1,其中攜帶2和3的預期結果。

但在第一種情況下,v是對錶的引用。在lua中,對錶的所有引用都進行了修改表或對該表的任何引用。 This問題包含有關參考值的主題的一些有用的信息。

+0

thx!我知道了,對和ipair只是函數返回表的值,對吧? – jammyWolf

+0

是的,正如答案中所述。再一次,如果你想修改表,'k'保存返回該值的鍵,所以'a [k] = something'會爲你設置這個值,儘管'v'不會更新。 – ATaco

+0

再次感謝~~~~ – jammyWolf