top of page

4 Todo es un objeto

 


Scala es un lenguaje orientado a objetos puro, en el sentido de que todo es un objeto, incluidos los números o las funciones. En ese aspecto se diferencia de Java, puesto que Java distingue tipos primitivos(como int y boolean) y tipos por referencia, y no permite manipular funciones como valores.

 


4.1 Los números son objetos

 

Puesto que los números son objetos, también tienen métodos. Y de hecho una expresión aritmética como esta:

 

1 + 2 * 3 / x

 

esta formada exclusivamente de llamadas a métodos, porque es equivalente a la siguiente expresión, como vimos en la sección anterior:

 

1.+(2.*(3./(x)))


Lo que significa también que +, *, etc. son identificadores válidos en Scala.

 


4.2 Las funciones son objetos


Quizá más sorprendente para el programador Java, las funciones también son objetos en Scala. Por tanto es posible pasar funciones como argumentos, guardarlas en variables y devolverlas como respuesta de otras funciones. Esta habilidad para manipular funciones como valores es una de las piedras angulares de un interesante paradigma de programación llamado programación funcional. Como ejemplo muy simple de porqué puede resultar útil el uso de funciones como valores, consideremos una función temporizador cuyo propósito sea realizar alguna acción una vez por segundo. ¿Cómo le pasamos la acción a realizar? lógicamente, como una función. Esta manera sencilla de pasar funciones debería ser familiar para muchos programadores: se utiliza frecuentemente en código de interfaces de usuario, para llamadas a funciones que hay que realizar cuando se produce algún evento.


En el siguiente programa, la función temporizador se llama unaVezPorSegundo, y toma una función como argumento. El tipo de esta función se escribe () => unit y es el tipo de todas las funciones que no tienen parámetros de entrada y que no devuelven nada(el tipo unit es similar a void en C/C++). El método main de este programa simplemente llama a la función temporizador para que repita cada segundo la impresión por pantalla de la frase “el tiempo pasa volando”.


object Temporizador {
    def unaVezPorSegundo(repite: () => unit) {
    while (true) { repite(); Thread sleep 1000 }
    }
    def elTiempoVuela() {
        println("el tiempo pasa volando...")
    }

    def main(args: Array [String] ) {
        unaVezPorSegundo(elTiempoVuela)
    }
}

 


Notese como para imprimir la cadena de texto usamos el método predefinido println en vez de usar elmétodo de System.out.

 


4.2.1 Funciones anónimas


Aunque este programa es fácil de entender, se puede refinar un poco. Antes de nada, se ve que la función elTiempoVuela solo se ha creado para ser pasada posterior mente como argumento almétodo unaVezPorSegundo. Tener que dar nombre a esa función, que sólo se usa una vez, parece innecesario, y de hecho estaría bien poder construirla justo cuando se le pasa a unaVezPorSegundo. En Scala esto es posible usando funciones anónimas, que son exactamente eso: funciones sin nombre. La
versión revisada de nuestro programa temporizador utilizando una función anónima en vez de elTiempoVuela queda así:


object Temporizador {
    def unaVezPorSegundo(repite: () => unit) {
    while (true) { repite(); Thread sleep 1000 }
    }
    def main(args: Array[String]) {
        unaVezPorSegundo(() =>
        println("el tiempo pasa volando..."))
    }
}


La presencia de una función anónima en este ejemplo, se revela por la flecha ‘=>’ que separa a la lista de argumentos de la función, del cuerpo de la misma. En este ejemplo la lista de argumentos es vacía, como indican los paréntesis vacíos a la
izquierda de la flecha. El cuerpo de la función es el mismo que el de elTiempoVuela antes.

bottom of page