Вы не можете. Комментарий Амбера правильный.
У Lua нет понятия сигнатур типа или прототипов функций.
Тип foo
- тип объекта, который он содержит, который является динамическим, изменяется во время выполнения. Это может быть function
в одно мгновение, и string
или integer
или что-то еще в следующем.
Концептуально У Lua нет такой стадии компиляции, как C. Когда вы говорите «запустите этот код», он начинает выполнение инструкций вверху и работает с ошибкой. В практике, Lua первый компилирует код в байткод перед его выполнением, но компилятор не будет упираться на что-то вроде этого:
greet()
function greet()
print('Hello.')
end
Поскольку значение, содержащееся в greet
определяется во время выполнения. Только когда вы на самом деле пытаетесь выполнить , вызовите (т.е. вызовите функцию) значение в greet
во время выполнения, что Lua обнаружит, что оно не содержит вызываемого значения (функция или таблица/userdata с метатемой, содержащей a __call
), и вы получите ошибку времени выполнения: «попытайтесь вызвать глобальное« приветствие »(значение nil)». Где «nil value» - любое значение greet
, содержащееся во время попытки вызова. В нашем случае это было nil
.
Вы должны убедиться, что код, который создает функцию и назначает ее foo
, вызывается до того, как вы попытаетесь позвонить foo
.
Это может помочь, если вы признаете, что это:
local myint = foo(1)
function foo(bar)
return bar
end
Является синтаксисом для этого:
local myint = foo(1)
foo = function(bar)
return bar
end
foo
в настоящее время присваивается значение функции. Это должно произойти, прежде чем пытаться вызвать эту функцию.
Наиболее распространенным решением этой проблемы является для лечения функции файла как «время компиляции», то есть: объявить все ваши постоянные данные и функции, когда файл выполняется, готовый для использования во время «исполнения время". Затем вызовите функцию
main
, чтобы начать «время выполнения».
Например:
function main()
greet()
end
function greet()
print('Hello.')
end
main()
Как greet
был объявлен в _G
, main
может получить к нему доступ.
У вас нет. Lua - динамически интерпретируемый, поэтапный, оцененный язык; тем самым пытается вызвать функцию до того, как она на самом деле имеет тело, недействительна. – Amber
просто так? Что мне тогда делать в таком случае? Поместить все пост-используемые функции в начало файла? Я не думаю, что переупорядочить файл каждый раз, когда функция входит, является допустимым способом. И будут ситуации, в которых я не буду работать. У вас есть ключ? –
В общем, вы должны иметь почти нулевой код на верхнем уровне - вместо того, чтобы поместить ваши вызовы на функции на верхнем уровне, поместите их в функцию 'main()' или аналогичную функцию и вызовите только функцию 'main()' в конце файла. Таким образом, все остальные функции будут определяться временем 'main()' funs. – Amber