Saltar a contenido

Los condicionales son estructuras de control de flujo condicional, si se cumple algo se ejecuta una instruccion en caso contrario se ejecuta otra instruccion

En PF hacer los condicionales siempre else, porque el condicional se reduce a un valor.

scala> def mayorEdad(x:Int):String = if (x >= 18) "Mayor de edad" else "Menor de edad"
def mayorEdad(x: Int): String

scala> mayorEdad(10)
val res17: String = "Menor de edad"

scala> mayorEdad(19)
val res18: String = "Mayor de edad"

Recordar que en PF todo debe reducirse a un valor

scala> val x = 13
val x: Int = 13

scala> val s = if (x>=18) "Mayor edad" else "Menor edad"
val s: String = "Menor edad"

scala> s
val res19: String = "Menor edad"

Observe que el condicional se reduce a un String

scala> val s = if (x>=18) "Mayor edad" else if (x < 10) "Niño" else "A
dolecente"
val s: String = "Adolecente"

Booleanos

scala> false && true
val res21: Boolean = false

scala> false & true
val res22: Boolean = false

scala> true || false
val res23: Boolean = true

scala> true | false
val res24: Boolean = true

Anotacion && y || son operadores de corto circuito, es decir en el caso de && si encuentra un false, no evalua mas, caso analogo con || si encuentra un true

def y val

def define por nombre, es decir no evalua de inmediato

val define por valor, es decir que obtiene el valor de inmediato

Por ejemplo para las funciones tenemos:

scala> def f(x:Int):Int = x
def f(x: Int): Int

scala> val f(x:Int):Int = x
-- [E127] Pattern Match Error: -----------------------------------------------------------------------------------------------
1 |val f(x:Int):Int = x
  |    ^
  |f cannot be used as an extractor in a pattern because it lacks an unapply or unapplySeq method with the appropriate signature
  |
  | longer explanation available when compiling with `-explain`
1 error found

Observar las definiciones recursivas

scala> def loop:Int = loop
1 warning found
-- Warning: ------------------------------------------------------------------------------------------------------------------
1 |def loop:Int = loop
  |^^^^^^^^^^^^^^^^^^^
  |Infinite recursive call
def loop: Int

scala> val l:Int = l
val l: Int = 0

en el primero loop solo se evalua por nombre, se va a evaluar cuando se llame

En el segundo caso l, se evalua por valor y se aplica la politica de java de valores por defecto, en este caso 0