2012-01-30 13 views
5

Duplicar posible:
“main” function in Lua?¿Cómo comprobar si un script está incluido a través de dofile() o ejecutar directamente en Lua?

En Python, se puede comprobar si un guión está siendo llamado direcly (y llamar a algunas funciones si lo es, por lo general para la prueba) con bastante facilidad:

if __name__ == "__main__": 
    main() 

¿hay una manera de hacer lo mismo en Lua, para detectar si se ejecuta directamente (lua foo.lua) o incluido en otro s cript (dofile('foo.lua')).

Siempre existe la manera trivial (y feo) de definir una variable global de maniquí en el archivo principal de guión antes dofile('foo.lua'), y en el registro foo.lua si se define o no, pero sería genial si había una manera mejor para hacer esto.

+0

Tienes razón, disculpa por el duplicado ... – Wookai

Respuesta

7

En el nivel superior se puede comprobar si debug.getinfo(2) es nula

De http://www.lua.org/manual/5.1/manual.html#pdf-debug.getinfo

se puede dar un número como el valor de la función, lo que significa que la función se ejecuta en función de nivel de la pila de llamadas del hilo dado: el nivel 0 es la función actual (getinfo mismo); el nivel 1 es la función que llamó getinfo; y así. Si la función es un número mayor que el número de funciones activas, entonces getinfo devuelve nil.

+0

Esto también devolvería 'true' para cualquier función ejecutada directamente desde el código incrustado. –

+0

eso es lo que asumí que el OP estaba comprobando con efectividad: si este script fue llamado directamente (o si se carga a través de require/dofile/loadfile/loadstring/etc) – daurnimator

+0

Estoy usando 5.2.3, y parece que necesito verificar 'depurar .getinfo (3) 'en lugar de' 2'. – dimo414

2

Nº Lua no tiene manera de saber si un guión está siendo invocado "directamente".

Recuerde: Lua y Python existen para diferentes propósitos. Python está diseñado para secuencias de comandos de línea de comandos. Usted escribe una secuencia de comandos, que llama a los módulos que pueden escribirse en Python, C++ o lo que sea. La secuencia de comandos de Python es en última instancia lo que está a cargo de qué código se llama cuando.

Lua es incrustado lenguaje de scripting, ante todo. Si bien puede usar el intérprete independiente lua.exe para crear scripts de línea de comandos, eso es algo así como un kludge. El objetivo principal del lenguaje es incrustarse en alguna aplicación escrita en C, C++ o lo que sea.

Debido a esto, no es ningún concepto de un script "principal". ¿Cómo definirías lo que es "principal" y lo que no? Si el código C puede cargar cualquier secuencia de comandos en cualquier momento, para cualquier propósito, ¿cuál de ellos es "principal"?

Si desea definir este concepto, es bastante simple. Sólo se adhieren esta en la parte superior de su script "principal":

do 
    local old_dofile = dofile 
    function new_dofile(...) 
    if(__is_main) then 
     __is_main = __is_main + 1 
    else 
     __is_main = 1 
    end 
    old_dofile(...) 
    __is_main = __is_main - 1 
    if(__is_main == 0) then __is_main = nil end 
    end 
    dofile = new_dofile 
end 

Por supuesto, esto no va a funcionar para cualquier cosa cargado con require; también necesitaría escribir una versión de esto para require. Y ciertamente no funcionará si el código externo usa las funciones de carga C-API (razón por la cual require probablemente no funcionará).

+0

¿Alguna razón para el -1? –

+0

No te recriminé, pero supongo que llamar a un kludge cualquier uso de Lua, pero la incrustación puede ser la razón.Estoy de acuerdo en que realmente brilla cuando está integrado, también es muy útil como lenguaje de scripting por sí mismo. – Wookai

Cuestiones relacionadas