2012-04-22 2 views
4

Простой вопрос: как установить прототип функции, которая еще не реализована?Настройка прототипа функции в Lua

Я просто хочу это сделать, потому что я имею в виду функцию, которая не существует (пока). В C, мы хотели бы сделать что-то вроде этого:

int foo(int bar); 

int myint = foo(1); 

int foo(int bar) 
{ 
    return bar; 
} 

Как это сделать в Lua (с короной)?

+5

У вас нет. Lua - динамически интерпретируемый, поэтапный, оцененный язык; тем самым пытается вызвать функцию до того, как она на самом деле имеет тело, недействительна. – Amber

+0

просто так? Что мне тогда делать в таком случае? Поместить все пост-используемые функции в начало файла? Я не думаю, что переупорядочить файл каждый раз, когда функция входит, является допустимым способом. И будут ситуации, в которых я не буду работать. У вас есть ключ? –

+1

В общем, вы должны иметь почти нулевой код на верхнем уровне - вместо того, чтобы поместить ваши вызовы на функции на верхнем уровне, поместите их в функцию 'main()' или аналогичную функцию и вызовите только функцию 'main()' в конце файла. Таким образом, все остальные функции будут определяться временем 'main()' funs. – Amber

ответ

7

Вы не можете. Комментарий Амбера правильный.

У 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 может получить к нему доступ.

+0

Миграция с C на Lua может быть сложной в эти времена. Спасибо за ваш полезный пост, как янтарь, так и грязь. –

Смежные вопросы