¿Cómo convierto un constructor de clase Groovy en un cierre?

Entonces Groovy tiene esta sintaxis relativamente útil para convertir métodos en cierres, por ejemplo

[1,2,3].each { println it }

// is equivalent to

[1,2,3].each this.&println

Pero, ¿cómo convierto un constructor de clase, por ejemplo?

[1,2,3].collect { new Thing( it ) }

// is equivalent to

[1,2,3].collect ????

El reflejo de Groovy tiene Thing.constructors Lista para inspeccionar, pero no puedo averiguar dónde poner el ampersand en Thing.constructors[0].

preguntado el 22 de mayo de 12 a las 17:05

Esta es una buena pregunta. Me imagino que no es posible, ya que Groovy hereda la distinción de Java entre métodos y constructores (es decir, los constructores no son solo métodos de clase); ¿pero quién sabe? :) -

1 Respuestas

Puede usar el invokeConstructor método de metaclase que invoca un constructor para los argumentos dados.

class Thing {
    Thing(Integer num) { this.num = num }
    Integer num
}

[1,2,3].collect Thing.metaClass.&invokeConstructor

contestado el 22 de mayo de 12 a las 23:05

Impresionante, funciona. Hubiera preferido algo más conciso como Thing.&new pero eso es Java para ti. ¿Sabes si hay beneficios de rendimiento o inconvenientes de esto sobre { new Thing( it ) }? - steven ruppert

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