2014-08-31 48 views
2
players={} 
players["foo"] = 
     { 
      wins = 0, deaths = 0, draws = 0, rounds = 0, bet = "None", rank = 0 
     } 
modify = function (stat, set, target) 
    local player = players[target] 
    local dictionary = 
      { 
      ["wins"] = player.wins, ["deaths"] = player.deaths, 
      ["draws"] = player.draws, ["rounds"] = player.rounds, 
      ["bet"] = player.bet, ["rank"] = player.rank, 
      } 
    if dictionary[stat] then 
     dictionary[stat] = set 
     print(dictionary[stat]) 
     print(player.wins) 
    end 
end 

modify("wins", 1, "foo") 

上面提到的代码并没有像预期的那样起作用。它修改了关键的“胜利”,但它的自身价值(玩家[target] .wins)未被修改。修改密钥但实际上并未修改该值?

回答

2

数字值不是引用。当您将参考文献复制回其原始位置时,您会得到复印件。

因此,当您分配["wins"] = player.wins时,您没有在播放器表中获得对wins字段的引用。您正在将该值复制到dictionary表中。

如果你想修改球员表,你需要修改球员表。

此外,该函数中的间接方法完全没有必要。你可以参考player[stat]就像你可以参考dictionary[stat]一样。

tbl.stat是 [0123]为tbl["stat"]

此外,如见于LUA手册§2.5.7

tbl = { 
    stat = 0, 
} 

相同

tbl = { 
    ["stat"] = 0, 
} 

时名是一个字符串,不以数字开头,并且不是保留的令牌。

[1]查看The type table段落。

+0

哦,我认为它不会工作,因为统计会是一个字符串谢谢! – user3603592 2014-08-31 14:31:37

+0

'tbl.stat'是'tbl [“stat”]'的语法糖。看我的编辑。 – 2014-08-31 14:34:16

+0

噢谢谢澄清 – user3603592 2014-08-31 14:41:00