Un pequeño paseo por ScalaRx: Parte I

Hoy el post va dedicado a una librería basada en la programación funcional reactiva: ScalaRx.

El objetivo principal de la librería es que, utilizando valores (val), vamos a definir un flujo de operaciones que cambiarán de forma dinámica cuando alguno de los valores cambien. A dichos valores los llamaremos variables reactivas.

Para utilizar la librería basta con añadir como dependencia:

libraryDependencies += "com.lihaoyi" %% "scalarx" % "0.3.1"

e importar rx:

import rx._

Variables reactivas

Las variables reactivas serán los elementos principales con los que podremos trabajar. Para definirlas usamos el constructor Var:

val reactiveVar = Var(0)

De esta manera, estamos definiendo una variable reactiva que contiene un 0. Como se puede observar, podemos usar val en vez de var a pesar de que el valor cambiará. Esto es debido a que el estado de la variable reactiva se maneja mendiante ScalaRx.

Una vez que tenemos una variable reactiva, podemos combinarla con otros valores estáticos o con otros variables reactivas. Para que se note que pilotamos, vamos a realizar una operación compleja. Vamos a realizar una suma de dos variables reactivas.

val sum1 = Var(1)
val sum2 = Var(4)
val result = Rx{ sum1() + sum2() }
result.now // Returns 5

Para poder hacer referencia a que queremos utilizar el valor de la variable de forma reactiva, se utilizan los paréntesis. Además, como queremos que el valor result cambie en función de los valores reactivos sum1 y sum2, lo englobamos en un bloque Rx. Si queremos evaluar result justo después de definirlo podemos utilizar el método now. Obviamente, obtenemos un número con rima fácil: un maravilloso 5.

De momento todo parece bastante simple. Ahora vamos a probar como funciona esto de los cambios reactivos. Para ello, vamos a cambiar el valor del primer sumando. Para ello volvemos a utilizar los paréntesis para hacer referencia a que estamos cambiando el valor contenido dentro de la variable reactiva.

sum1() = 2

Esta actualización del primer sumando provocará un cambio reactivo que afectará a todo el flujo que se haya definido. En este caso, afectará únicamente al valor result.

result.now // Returns 6

Este ha sido un ejemplo muy sencillo. Sin embargo, podemos crear flujos más complejos que, al actualizar el valor de una variable reactiva, mediante un efecto dominó, vaya provocando una reacción en el resto de elementos.

giphy

Probablemente estés pensando “esto ya lo hago yo cambiando las variables reactivas por unos var de toda la vida y apañao”. Pues efectivamente. Sin embargo, Rx está pensado para obtener notificaciones de los cambios de las variables reactivas y poder reaccionar a ellas. (aquí podreis encontrar una explicación más completa). Para ello usa los Observables. Pero para eso tendremos que esperar a la segunda parte del post.

Hasta la próxima! 🙂

Anuncios

3 thoughts on “Un pequeño paseo por ScalaRx: Parte I

  1. Sabeis, sin tener que mirarlo mucho, si el evento lo lanza siempre que se hace una asignación? o solamente si cambia el valor?

    Es decir si tengo

    val sum1 = Var(1)
    sum1() = 1

    lanzaría un ‘onChange’ (como se llame en Rx)? yatusabe

    Me gusta

    • Efectivamente. Cuando se hace una asignación (por ejemplo, sum() = 1 ) realmente estás cambiando el valor de la variable reactiva sum, por lo que se producirá un evento de cambio. Dicho evento se podrá capturar mediante un Observable y reaccionar a él con una función. Es lo que veremos en la segunda parte de este post.

      Espero haber respondido a tu duda.

      Gracias por el feedback una vez más 😉

      Un saludo!

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s