Recientemente tuve una idea para solucionar de una manera más o menos elegante un problema que tuve en actionscript 3. Lamentablemente, uno de mis co-workers me avisó que eso ya se había inventado hace décadas y que era una de las bases de los llamados lenguajes funcionales.
Así que, luego de una investigación de 15 minutos en Wikipedia y Google aprendí que los lenguajes funcionales (como LISP o Phyton) permiten ejecutar una función en un Array (es decir, elemento a elemento)
El hecho de que AS3 incluya estas operaciones puede ser sumamente útil en muchísimos casos. Veamos de qué se trata (para acortar espacio, obvié la función en donde ubico el trace, para probar los ejemplos, incluir el trace en el constructor):
every
Descripción: Ejecuta una función en cada elemento del Array hasta que la función devuelva false. La evaluación devuelve true si la función devolvió true para todos los elementos del Array.
Uso: verificar si los elementos de un Array cumplen determinada condición.
Ejemplo (nos dice si un Array está ordenado de forma creciente):
Código :
private var myArray:Array = new Array (3, 4, 6, 9, 10, 11); private var myPrev:int = myArray[0]; private function myEveryFunction (item:*, index:int, array:Array):Boolean { if (index == 0) return true;
Parámetros: Como parámetros le pasamos la función que queremos ejecutar y un objeto cualquiera que serviría de this.
filter
Descripción: Devuelve un Array con todos los elementos que cumplen determinada condición.
Uso: Como su nombre lo indica, filtrar elementos de un Array.
Ejemplo (devuelve los valores numéricos del Array):
Código :
private var myArray:Array = new Array (3, 5, "texto", this, 11); private function myFilterFunction (item:*, index:int, array:Array):Boolean { return item is Number; } trace (myArray.filter (myFilterFunction)); // Output: 3,5,11
Parámetros: Como parámetros le pasamos la función que queremos ejecutar y un objeto cualquiera que serviría de this.
forEach
Descripción: Ejecuta una función una vez por cada item del Array. No devuelve nada.
Uso: A primera vista puede parecer algo inutil, en la práctica resulta interesante para reemplazar el for. El mejor uso que le encontré hasta ahora es el del ejemplo (con ciertas variantes, por supuesto)
Ejemplo (mueve todos los MovieClips a su siguiente posición):
Código :
private var myArray:Array = new Array (mc1, mc2, mc3); private function myForEachFunction (item:*, index:int, array:Array):void { item.moveToNextPos (); } myArray.forEach (myForEachFunction);
Parámetros: Como parámetros le pasamos la función que queremos ejecutar y un objeto cualquiera que serviría de this.
map
Descripción: Devuelve un Array compuesto por los valores que devolvió la función.
Uso: Muchísimos usos, es sorprendentemente útil.
Ejemplo (devuelve una lista con los primeros cuadrados perfectos):
Código :
private var myArray:Array = new Array (1, 2, 3, 4, 5, 6); private function myMapFunction (item:*, index:int, array:Array):int { return item * item; } trace (myArray.map (myMapFunction)); // Output: 1,4,9,16,25,36
Parámetros: Como parámetros le pasamos la función que queremos ejecutar y un objeto cualquiera que serviría de this.
some
Descripción: El hermano gemelo de every, ejecuta una función hasta que ésta devuelve true.
Uso: prácticamente los mismos que every.
Ejemplo (nos dice si un Array tiene elementos indefinidos):
Código :
private var myArray:Array = new Array (3, 4, undefined, 9, 10, 11); private function mySomeFunction (item:*, index:int, array:Array):Boolean { return item == undefined; } trace (myArray.some (mySomeFunction)); // Output: true
Parámetros: Como parámetros le pasamos la función que queremos ejecutar y un objeto cualquiera que serviría de this.
Y eso es todo, pero como vimos, el potencial de estos métodos es enorme. En lo personal voy a comenzar a usarlos bastante, más que nada por su potencial de simplificar código.
Buena info HernanRivas Son realmente útiles estos nuevos métodos de la clase Array, sobre todo el forEach() De igual manera es muy útil la mueva declaración for each..in Por:Zguillez
Hernan. Sos un groso, sabelo. Un par de cositas. Python no es _sólamente_ un lneguaje funcional. es un lenguaje polimórfico y multiparadigma que permite _algunas_ de las características de un lenguaje funcional.
Un lenguaje bien cheto para aprender el paradigma funcional es [url="http://www.haskell.org"]haskell[/url]. Bien documentado con una sintaxis y parecida a lisp. Te quemás la cabeza para hacer cosas muy básicas (como sort) pero está muy bueno para aprender conceptos generales que se pueden aplicar en otros lenguajes Por:el_itur_blog
Recientemente estaba desarrollando un programa y necesitaba manejar una matriz para una aplicacion, por mas que busque no encontre la forma, solo manejando Arrays, no se si se elimino de flash 9 y de flash 8, pero seria de gran ayuda que volviesen a agregar esta funcion de flash Por:Moises Trejo_blog
Hasta donde sé, no quitaron nada, sino que agregaron... Qué es exactamente lo que no podés hacer? Por:Duque de Rivas (logout)_b
Esas funciones son la base de mi trabajo... y ya era hora que las agregaran dentro de la clase Array, ya q hasta el AS3 utilizaba funciones propias q hacian lo mismo.
Un comentario, estas funciones que yo sepa no son propias de lenguajes funcionales, sino de lenguajes orientados a objetos un poco mas puros que AS... en donde no hay for ni while y los únicos iteradores son estos y otros, que luego pasaron a ser tipo un patrón de manipulación de colecciones (donde estan incluidos los Array) independiente del paradigma del lenguaje, por eso estas funciones siempre se llaman igual, map, some, every, etc Por:andres_blog