Переопределена таблица Lua

#lua

#lua

Вопрос:

Предполагается, что это простая функция возврата. Dest — это глобальная таблица, которая должным образом редактируется в функции. Предполагается, что предыдущая таблица отслеживает мои предыдущие позиции, чтобы не возвращаться к ним. Однако моя предыдущая таблица всегда оказывается пустой. Я новичок. Если есть какая-либо другая полезная информация, я буду рад ее предоставить. u

 function GoTo(dest, prev)
    -- base case
    if dest[1] == position[1] and dest[2] == position[2] and dest[3] == position[3] then
        return true
    end
    local prev = prev or {}
    -- save destination as to not return here
    prev[table.concat(position)] = true
    -- create key for next move
    local key = {0,0,0}
    for i,v in ipairs(dest) do
        if dest[i] ~= 0 then
            key[i] = dest[i]/math.abs(dest[i])
        end
    end
    -- attempt to move in optimal direction
    for i,v in ipairs(key) do
        if key[i] ~= 0 then
            -- check if next move leads to a visited destination
            position[i] = position[i]   v
            local check = prev[table.concat(position)]
            position[i] = position[i] - v
            if not check then
                if moveTo(i,v) then
                    if GoTo(dest, prev) then
                        return true
                    end
                    -- go back
                    if not moveTo(i, -v) then
                        error("cannot backtrack")
                    end
                end
            end
        end
    end
end
  

Ответ №1:

local prev = предыдущий или {}

Вы создаете локальную переменную в своей функции и инициализируете ее из передаваемого параметра с тем же именем, который скрывает все изменения внутри функции, и, вероятно, поэтому вы не видите никаких изменений для этой таблицы. Вам нужно инициализировать эту таблицу вне функции и передать ее значение (и удалить этот local prev оператор).

Комментарии:

1. Я удалил local prev . Я попытался вызвать функцию, подобную GoTo(dest, {}) . Я попытался инициализировать таблицу для передачи как локальной, так и глобальной. Я также создал оболочку function goTo(dest) local record = {} return GoTo(dest, record) end . Я попробовал сделать запись локальной и оставить ее глобальной. Я все еще не могу подтвердить, что таблица меняется. Способ, которым я проверяю содержимое таблицы, находится for i,v in ipairs(prev) do print(i,v) end в функции GoTo сразу после редактирования таблицы. Большое вам спасибо за вашу помощь!

2. @spanish_gunther вы не можете проверить prev , ipairs нужно ли использовать pairs . ipairs будет искать последовательные ключи, начиная с 1 вашей prev таблицы, не организованной таким образом ipairs , чтобы работать.

3. @Nifim конечно! Он работает так, как ожидалось. Большое вам обоим спасибо.

4. Возможно, вы захотите принять ответ, если он сработал для вас.