Expresiones y operaciones¶
-
Expresiones primitivas: En Scala, las expresiones primitivas incluyen tipos básicos como
Int,BooleanyChar. Estas representan valores fundamentales que pueden ser evaluados para producir resultados. -
Operaciones entre expresiones: Las operaciones aritméticas y de otro tipo (como
+,-,.size, etc.) permiten combinar expresiones primitivas para crear expresiones más complejas. -
Orden de evaluación y precedencia de operadores: Las operaciones se evalúan de izquierda a derecha, pero respetando la precedencia de los operadores (por ejemplo, la multiplicación tiene mayor precedencia que la suma). Los paréntesis tienen la máxima prioridad en la evaluación.
// Ejemplo 1: Suma simple evaluada de izquierda a derecha
scala> 1+2+3+4+5
val res4: Int = 15
// Evaluación: ((((1+2)+3)+4)+5) = 15
scala> 3+3+4+5
val res5: Int = 15
// Evaluación: ((((3+3)+4)+5) = 15
scala> 6+4+5
val res6: Int = 15
// Evaluación: ((6+4)+5) = 15
scala> 10+5
val res7: Int = 10 + 5 = 15
scala> 15
val res8: Int = 15
// Resultado final tras todas las evaluaciones anteriores
// Ejemplo 2: Expresión con multiplicación que respeta precedencia
scala> 2+3+4*5
val res9: Int = 25
// Evaluación: 2+3+(4*5) = 2+3+20 = 25
// La multiplicación se evalúa antes que la suma debido a su mayor precedencia
// Ejemplo 3: Uso de paréntesis para alterar la precedencia
scala> (2+3+4)*5
val res10: Int = 45
// Evaluación: (2+3+4)*5 = 9*5 = 45
// Los paréntesis fuerzan la evaluación de la suma antes de la multiplicación
Conceptos teóricos adicionales¶
Expresión: En Scala, una expresión es una construcción sintáctica que se evalúa para producir un valor. Todo en Scala es una expresión, incluyendo estructuras de control como if, while y for.
Precedencia de operadores: Scala sigue reglas estándar de precedencia similares a las matemáticas. El orden de precedencia (de mayor a menor) es aproximadamente:
- Multiplicación (*), división (/), módulo (%)
- Suma (+), resta (-)
- Asignación y operadores especiales
Asociatividad: La mayoría de los operadores aritméticos son asociativos a la izquierda, lo que significa que a + b + c se evalúa como (a + b) + c.
Funciones¶
Una función en Scala es una abstracción que encapsula un cálculo o un conjunto de operaciones. Las funciones reciben parámetros (también llamados argumentos) y devuelven un valor basado en esos parámetros.
// Ejemplo 1: Definición de un valor sin parámetros
scala> def a = 10
def a: Int
// 'a' es un valor definido como 10, de tipo Int
// No requiere parámetros
// Ejemplo 2: Definición de una función con un parámetro
scala> def f(x:Int):Int = 10
def f(x: Int): Int
// 'f' es una función que recibe un parámetro 'x' de tipo Int
// La función retorna un valor de tipo Int (en este caso siempre 10)
// La función ignora el parámetro x y devuelve una constante
// Ejemplo 3: Acceso a un valor definido sin parámetros
scala> a
val res11: Int = 10
// Al acceder a 'a', se obtiene directamente el valor 10
// Ejemplo 4: Acceso a una función sin invocarla
scala> f
val res12: Int => Int = Lambda$1608/0x00007f31505d0000@46eaf531
// Al referenciar 'f' sin paréntesis, se obtiene un objeto de tipo "Int => Int"
// Este tipo indica una función que recibe un Int y retorna un Int
// Lambda$1608... es la representación interna de la función en memoria
// Para invocar la función se debe usar f(valor)
Conceptos teóricos adicionales¶
Parámetros vs Argumentos: Los parámetros son los nombres de las variables definidas en la firma de la función (como x en def f(x:Int)), mientras que los argumentos son los valores reales pasados al invocar la función (como 5 en f(5)).
Tipo de retorno: El tipo especificado después de los parámetros (como :Int después del paréntesis) indica el tipo de valor que la función devuelve.
Diferencia entre valores y funciones sin argumentos: Un valor definido como def a = 10 puede accederse directamente sin paréntesis. Una función def f(x:Int):Int = 10 requiere paréntesis para ser invocada, incluso si no hay parámetros reales (se escribiría f(5)).
Tipo función: El tipo Int => Int representa una función que recibe un Int como entrada y produce un Int como salida. Es un tipo de dato en sí mismo, lo que permite pasar funciones como parámetros a otras funciones (funciones de orden superior).
Tabla de resumen¶
| Concepto | Definición | Ejemplo |
|---|---|---|
| Expresión primitiva | Valor fundamental de un tipo básico en Scala | 5, true, 'a' |
| Operación aritmética | Combinación de expresiones usando operadores | 2 + 3, 4 * 5 |
| Precedencia de operadores | Regla que determina qué operaciones se evalúan primero | 2 + 3 * 4 = 14 (no 20) |
| Asociatividad (izquierda) | Evaluación de izquierda a derecha en operadores del mismo nivel | 10 - 3 - 2 = 5 (no 9) |
| Paréntesis | Símbolos que alteran el orden de evaluación | (2 + 3) * 4 = 20 |
| Función | Abstracción que encapsula cálculos y recibe parámetros | def f(x:Int):Int = x * 2 |
| Parámetro | Variable en la definición de una función | x en def f(x:Int) |
| Tipo de retorno | Tipo de dato que una función devuelve | :Int en def f(x:Int):Int |
| Tipo función | Tipo que representa una función como valor | Int => Int |
| Evaluación | Proceso de ejecutar una expresión para obtener su valor | Entrada → Cálculo → Resultado |
Comentarios adicionales¶
-
Todo es una expresión: A diferencia de muchos lenguajes de programación, en Scala incluso las definiciones de funciones y las estructuras de control producen valores que pueden ser utilizados.
-
Inferencia de tipos: Aunque en los ejemplos se muestran tipos explícitos, Scala puede inferir tipos automáticamente en muchos casos, permitiendo código más conciso.
-
Inmutabilidad por defecto: Los valores definidos con
defson inmutables por defecto, lo que promueve un estilo de programación funcional. -
Funciones como valores de primera clase: En Scala, las funciones son valores que pueden ser pasados, almacenados y retornados como cualquier otro dato, lo que es una característica fundamental de los lenguajes de programación funcionales.