2012-02-27 13 views
14

¿Es posible crear un módulo Lua que devuelva resultados múltiples a través de la función require? Actualmente estoy escribiendo una extensión para package.loaders y quiero saber si necesito apoyar ese comportamiento.Can Lua's require function return multiple results?

Por ejemplo, tomemos el siguiente módulo, llamado mod.lua:

print("module loading") 
return "string1", "string2" 

que es requerido por el siguiente script:

print("running script") 
s1, s2 = require("mod") 
print("s1: " .. tostring(s1)) 
print("s2: " .. tostring(s2)) 

Los resultados en la siguiente salida:

running script 
module loading 
s1: string1 
s2: nil 

Cuando esperaría que se devolviera la segunda cuerda. No busco usar ese tipo de comportamiento, y me doy cuenta de que puedes replicarlo devolviendo una tabla y desempacando eso, solo quiero saber si está destinado a funcionar (ya que es una sintaxis Lua válida) y no puedo encontrar un respuesta definitiva sobre esto en cualquier lugar.

Respuesta

10

Lua exportación 5.1.3
require lua implementado en static int ll_require (lua_State *L) en loadlib.c archivo. Esta función siempre devuelve 1 como el número de valores devueltos en la pila.

+1

Sí, parece de esa manera mirando la fuente (estoy en Lua 5.2 y es el mismo valor de retorno único). Supongo que la restricción se debe en parte a que almacena el resultado en '_LOADED [" mod "]' y no podría devolver múltiples valores desde allí sin empaquetarlos en una tabla y desempacarlos nuevamente, lo cual es innecesario en la mayoría de los casos. – GooseSerbus

+1

@GooseSerbus También es porque 'require' modifica el valor de retorno. Si el módulo devuelve 'nil',' require' devuelve 'true' en su lugar. – finnw

8

Siempre se puede devolver una función a partir de su módulo y tienen que devuelven varios valores, como a continuación:

foo.lua

return function() return "abc", 123 end 

bar.lua

local a, b = require "foo"()