Uso de cierres para especificar valores de parámetros predeterminados en Groovy

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?

preguntado el 25 de julio de 12 a las 20:07

1 Respuestas

Puede usar el valor predeterminado it parámetro:

def generateUniqueIdent(String text, uniqueSuffix = { hash(it) }) {
   doSomething(text) + uniqueSuffix(text)
}

(ejemplo de trabajo)

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

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 el text parámetro. he publicado un error aquí en Groovy JIRA - tim_yates

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.