2010-04-24 16 views
5

Supongamos Estoy insertando una cadena en un cuadro como el siguiente:En Lua, ¿puedo seleccionar fácilmente el enésimo resultado sin funciones personalizadas?

table.insert(tbl, mystring) 

y que mystring se genera mediante la sustitución de todas las ocurrencias de "a" a "b" en input:

mystring = string.gsub(input, "a", "b") 

La obvia forma de combinar los dos en una declaración no funciona, porque gsub devuelve dos resultados:

table.insert(tbl, string.gsub(input, "a", "b")) -- error! 
-- (second result of gsub is passed into table.insert) 

que, supongo, es el precio pagado por soportar múltiples valores devueltos. La pregunta es, ¿existe una forma incorporada estándar para seleccionar solo el primer valor de retorno? Cuando encontré select, pensé que era exactamente lo que hacía, pero, por desgracia, en realidad selecciona todos los resultados de N en adelante, por lo que no ayuda en este escenario.

Ahora sé que puedo definir mi propia select de la siguiente manera:

function select1(n, ...) 
    return arg[n] 
end 

table.insert(tbl, select1(1, string.gsub(input, "a", "b"))) 

pero esto no se ve bien, ya que cabe esperar de una manera integrada de hacer esto.

Entonces, ¿me falta algo de construcción incorporada? Si no, ¿los desarrolladores de Lua tienden a usar una variable separada para extraer el argumento correcto o escribir sus propias funciones select1?

Respuesta

11

Puede rodear la expresión entre paréntesis:

table.insert(tbl, (string.gsub(input, "a", "b"))) 

Esto seleccionará sólo el primer resultado.

Para obtener el resultado enésima, puede utilizar select y rodearlo de paréntesis:

func1((select(n, func2()))) 
+0

Gracias! Apuesto a que eventualmente me encontraré con la misma situación queriendo solo el segundo resultado, ¿qué opciones tengo entonces? –

+0

@romkyns: actualicé mi publicación para responder. Aunque su función 'select1' puede ser más legible. – interjay

+0

Me gusta usar dummies para esto, es decir '_, _, _, fourthVal, _ = giveMeFive()' Lo encuentro más legible de esa manera. – deorst

5

Poniendo una expresión en paréntesis, así:

table.insert(tbl, (string.gsub(input, "a", "b")))

obligará a un valor de retorno. O se puede coger a los dos así:

str,cnt = string.gsub(input, "a", "b") 
table.insert(tbl, str) 

o mejor aún, la captura simulada para salvar a una variable:

str,_ = string.gsub(input, "a", "b") 
table.insert(tbl, str) 
+0

No hay ninguna razón para asignar aquí dos variables. Solo puede asignar una variable y el segundo valor se descartará, como se muestra al principio de la pregunta. – interjay

+1

Simplemente demostrando una forma de lidiar con múltiples valores de retorno además de seleccionar, a veces es difícil hacer un seguimiento de los ajustes del valor de retorno en llamadas anidadas enormes. – deorst

5

En una línea: ({ funct(args) })[n] sería devolver el resultado enésimo sin declarar cualquier variables nombradas

Cuestiones relacionadas