style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Groovy <<

Hola a todos.
Intente buscar una fuente en Internet donde me pudiera documentar nutridamente de operadores como ‘<<’, pero no logro encontrar nada, solo esta página (http://groovy.codehaus.org/Bitwise+Operations) Les agradecería mucho si me pudieran decir alguna fuente de libre acceso o que palabras ocupar en google para recuperar resultados útiles.
Gracias por su tiempo.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Parece que es similar a Java

Pues por lo que veo funcionan igual que en Java, ya que cuentan con los mismos operadores de bits (según recuerdo -aunque es a lo que estoy dándole, no es un tema que domine-).

Sería bueno que @domix o @ezamudio, por mencionar algunos grooviers de aquí respondieran esta pregunta.

Imagen de bferro

Los operadores se mapean a métodos

Sin entrarle mucho a una discusión profunda sobre lo que significa realmente "sobrecarga de operadores", es fácil entender que en Groovy, varios operadores se mapean a métodos que pueden aplicarse sobre diferentes clases de objetos como Numbers, Collections, Maps y otras estructuras de datos.
Uno de esos operadores es  <<, que está mapeado al método leftShift. Así, el código a << b se interpreta como a.leftShift(b).
Lo que realiza el método leftShift depende entonces del tipo de objeto que lo recibe, en este caso el objeto a.

Siguen algunos ejemplos:

//Desplazamiento de n bits a la izquierda de un ordinal
println 5<< 2 //Equivalente a println 5.leftShift(2).

//Añadir elementos a un colección
lst = [1, 3, 4, 1, 8, 9, 2, 6]
lst.each { println it }
doubled = []
lst.each { doubled << it * 2} //Equivalente a doubled.leftShift(it  * 2).

//Escribir a un flujo
new File("output.txt").withWriter{ file ->
 file << "some data..."  //Equivalente a file.leftShift("some data .....")
}

Syntactic sugar causes cancer of the semicolon. Alan Perlis

Imagen de rodrigo salado anaya

Muchas gracias @bferro.

Gracias por la explicación, me quedo de tarea echarme un par de ejemplos para ver cómo se comporta otros operadores.
Saludos : )

Imagen de ezamudio

Operadores Groovy

Tienes leftShift y rightShift que ya los viste, y además add, subtract, multiply, divide, para poder usar los operadores aritméticos. Tienes or y and para poder usar los bitwise, not para negar con signo de admiración (o tilde? no estoy muy seguro). Tienes también putAt y getAt para usar los corchetes como operador de lectura o asignación de alguna propiedad, tipo mapa[llave]=valor; def x = mapa[llave].

No sé cómo le hiciste para no encontrar nada, porque "groovy operator overloading" me lleva a la página en Codehaus donde explican todo esto.

Imagen de bferro

Overloading vs. Object Technology

Overloading vs Object Technology es el nombre de un artículo de Bertrand Meyer disponible aquí publicado en Journal of Object Oriented Programming en octubre de 2001.
El artículo comienza así:
"A C++ programmer said to Rabbi Shammai: “I promise to try object technology if you can explain the secret of objects while standing on one foot.
Rabbi Shammai whacked him on the head with a 10-by-2 ruler. He went to Rabbi Hillel who, standing on one foot, answered: “No overloading.
That is the secret of objects. All the rest is commentary.”"

Vale la pena leerlo.

Imagen de ezamudio

Groovy

En el caso de Groovy me parece más inocua la sobrecarga de operadores porque no puedes definir los que quieras, sino solamente los que ya soporta Groovy. Si en tu clase implementas ciertos métodos como leftShift, rightShift, compareTo, etc entonces los puedes invocar con los operadores en código Groovy. Pero no puedes definir los que se te antojen, a diferencia de Scala donde sí puedes implementar métodos con el nombre de operador que se te antoje. Eso se presta para ciertos abusos y al final en vez de simplificar la lectura de código, la complica porque si no sabes qué hace el método :+ tienes que ir a la documentación, o confiar en que el autor de ese objeto haya seguido ciertos lineamientos y que entonces ese método se comporte igual que los de las colecciones de Scala, etc.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">