#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. Возможно, вы захотите принять ответ, если он сработал для вас.