Странная ошибка со столом в Луа - PullRequest
1 голос
/ 03 июля 2019

Я добавляю строку в таблицу в lua.Когда я использую таблицу в функции, исходная таблица изменяется.Я только новичок, но я подумал, что функция не может сделать это, потому что это выходит за рамки.Есть ли что-то очевидное, что мне не хватает?

local testTable= {}
testTable.name = {}
testTable.name[1] = "Jon"

print(testTable.name[1])

local function testFunc(a)
    a.name[1] = "Bob"
end

local newTable = testTable

testFunc(newTable)

print(testTable.name[1])

Я ожидал, что результат будет:

Jon
Jon

Фактический результат:

Jon
Bob

Как можноtestFunc изменить таблицу испытаний?

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Когда я использую таблицу в функции, исходная таблица изменяется. ... Я думал, что функция не может сделать это, потому что она находится за пределами ее области действия.

Локальные переменные имеют собственную область видимости, а таблицы - нет. Две вещи, которые нужно запомнить:

  • Переменные хранят ссылки, а не значения. (Это имеет значение только для изменяемых значений.)
  • Таблицы являются изменяемыми, т.е. они могут быть изменены внутри.

Разбивка:

local newTable = testTable

В этой строке вы присваиваете одну переменную другой, поэтому обе переменные ссылаются на одну и ту же таблицу.

Мы изменяем таблицу, присваивая индекс в этой таблице, поэтому testFunc изменяет все, на что ссылается a (на самом деле a.name). Это удобно, потому что позволяет нам писать функции, которые изменяют таблицы, которые мы передаем в качестве аргументов.

Следующая функция ничего не делает, как и следовало ожидать, потому что она присваивает новую таблицу пустому имени a (которая оказывается локальной переменной):

local function doNothing(a)
  a = {name = {'Bob'}}
end
0 голосов
/ 03 июля 2019

Вы назначаете адрес testTable для newTable, так что testTable и newTable указывают на одну и ту же таблицу. Если вы хотите вывести:

Jon
Jon

Вам следует скопировать таблицу при назначении newTable. Вы можете скопировать таблицу как эта функция:

function table.copy(old)
    local new = {}
    for k, v in pairs(old) do
        new[k] = v
    end
    return new
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...