Uso de cierres para especificar valores de parámetros predeterminados en Groovy
Frecuentes
Visto 875 veces
2
Consideremos la siguiente función:
def generateUniqueIdent(String text, uniqueSuffix = {uid -> String.valueOf(uid)}) {
doSomething(text) + uniqueSuffix()
}
Ahora, cuando intento la siguiente modificación:
def generateUniqueIdent(String text, uniqueSuffix = { hash(text) }) {
doSomething(text) + uniqueSuffix()
}
..Recibí el siguiente error:
| Error Error fatal durante la compilación org.apache.tools.ant.BuildException: ¡ERROR! excepción en la fase 'generación de clase' en la unidad de origen 'algún camino aquí' intentó obtener una variable con el nombre texto como variable de pila, pero no se creó una variable con este nombre (Use --stacktrace para ver el seguimiento completo)
Al mismo tiempo, si trato de usar el nombre text
como parámetro del cierre:
def generateUniqueIdent(String text, uniqueSuffix = {text -> hash(text) }) {
doSomething(text) + uniqueSuffix(text)
}
..entonces tengo otro error:
El alcance actual ya contiene una variable del nombre texto
La pregunta es: ¿puedo obtener acceso de alguna manera a otros parámetros desde un cierre, que se asigna como valor predeterminado a uno de los parámetros de función?
Si no, entonces, ¿por qué no puedo usar el mismo nombre que tiene uno de los parámetros de función dentro del cierre descrito?
1 Respuestas
2
Puede usar el valor predeterminado it
parámetro:
def generateUniqueIdent(String text, uniqueSuffix = { hash(it) }) {
doSomething(text) + uniqueSuffix(text)
}
O use un nombre diferente para el parámetro de cierre en lugar de text
:
def generateUniqueIdent(String text, uniqueSuffix = { x -> hash(x) }) {
doSomething(text) + uniqueSuffix(text)
}
(ejemplo)
Desafortunadamente, acceder al parámetro anterior desde el cierre está trabajando para mí en este caso, así que no sé cuál es el problema original: S
Respondido 25 Jul 12, 20:07
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas grails groovy parameters closures or haz tu propia pregunta.
Gracias por verificar, que funciona. Entonces, el problema es con mi versión groovy/grails o con el complemento IDE. - novela
@Roman, ¿funciona la primera o la segunda solución? Si no, ¿cómo es el error? - epidemia
@Roman puedo conseguir el
BUG!
excepción si configuro un parámetro predeterminado para eltext
parámetro. he publicado un error aquí en Groovy JIRA - tim_yates