Изменяет ключ, но на самом деле не изменяет значение?
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")
Код, упомянутый выше, на самом деле не работает так, как должен. Он модифицирует ключ "выигрывает", но значение, которое он сам (игрок [цель].wins) не изменяется.
1 ответ
Числовые значения не являются ссылками. Вы получаете копии, когда копируете их, а не ссылки обратно в их исходное местоположение.
Поэтому, когда вы назначаете ["wins"] = player.wins
вы не получаете ссылку на wins
поле в таблице игрока. Вы копируете значение в dictionary
Таблица.
Если вы хотите изменить таблицу игроков, вам нужно изменить таблицу игроков.
Кроме того, косвенность в этой функции совершенно не нужна. Вы можете ссылаться player[stat]
так же, как вы можете сослаться dictionary[stat]
,
tbl.stat
является синтаксическим сахаром [1] для tbl["stat"]
,
Кроме того, как видно из §2.5.7
руководства lua:
tbl = {
stat = 0,
}
такой же как
tbl = {
["stat"] = 0,
}
когда имя является строкой, не начинается с цифры и не является зарезервированным токеном.
[1] См. The type table
параграф.