Изменяет ключ, но на самом деле не изменяет значение?

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 параграф.

Другие вопросы по тегам