У меня есть две функции, которые иногда называют друг друга, и они являются локальными для модуля, который использует их для создания другой функции. Модуль несколько похож на этот кусок кода:Локальные функции, вызывающие друг друга
local function iseven(n)
if n == 1 then
return false
else
return isodd(n - 1)
end
end
local function isodd(n)
if n == 1 then
return true
else
return iseven(n - 1)
end
end
local evenOrOdd = function(n)
return iseven(n) and "Even" or "Odd"
end
return evenOrOdd
Проблема заключается в том, при вызове evenOrOdd
из другого файла я получаю ошибку attempt to call global 'isodd' (a nil value)
.
Я заметил, что этого не происходит, если я установил iseven
в глобальный, но я хотел бы сохранить их локальными в моем модуле.
Я даже попробовал поставить объявление фиктивной функции (local function isodd() end
) перед строкой, где объявляется iseven
. Я также попытался вставить только local isodd
вместо объявления фиктивной функции, но в обоих случаях это не работает, и я получаю разные ошибки.
Я знаю, что это происходит потому, что Lua имеет закрытие и когда iseven
объявлен он улавливает фактическое значение isodd
, которое либо nil
или фиктивную функцию, и изменение его после того, как не в счет, но есть способ обойти это?
Пример форвардной декларации в Lua: 'local f; локальная функция g() return f() end; функция f() return g() end' –
@Egor Skriptunoff oh right. Как я уже сказал в этом вопросе, я попробовал. Но, похоже, я забыл удалить 'local' перед' function isodd (n) ', и я получил' попытку вызвать upvalue 'isodd' (значение nil) 'error. Благодарю. – user6245072
Сообщение об ошибке для кода, который вы указали, должно быть 'пытаться вызвать глобальный 'isodd' (значение nil)', которое должно объяснить, что произошло. – lhf