Concepto de variable Las variables no son más que posiciones de memoria reservada para almacenar los valores. Esto significa que cuando se crea una variable se reserva algo de espacio en la memoria. Basado en el tipo de datos de una variable, el compilador asigna memoria y decide lo que se puede almacenar en la memoria reservada. Por lo tanto, mediante la asignación de diferentes tipos de datos a variables, se puede almacenar números enteros, decimales o caracteres en estas variables. Variables (y valores) locales Las variables en scala se pueden declarar de dos tipos, como mutables o inmutables. Se pueden ver como "variables" o "constantes". Para esto existen dos keywords: var y val var nombre : String = "World"; println("Hello, " + nombre + "!"); Al ser una variable (es decir mutable) podemos hacer: var nombre : String = "World"; nombre = "PACO"; println("Hello, " + nombre + "!"); Por otro lado, si fuera una constante o valor, se escribiría así: val nombre : String = "World"; println("Hello, " + nombre + "!"); Y en tal caso la linea 'nombre = "PACO"' no compilaría. Ya que los valores no pueden modificarse (son referencias inmutables) Variable de Inferencia de tipos: Al asignar un valor inicial a una variable, el compilador de Scala puede averiguar el tipo de la variable en función del valor asignado a la misma. Esto se conoce como inferencia de tipo de variable. Por lo tanto, se podría escribir estas declaraciones de variables como la siguiente: Aquí por defecto myVar será de tipo Int y myVal se convertirá en variable de tipo String. Tipos primitivos proveídos por el lenguaje. Scala provee algunas funciones básicas, que son primitivas para construir funciones más complejas. Un tipo primitivo está predefinido por el lenguaje y se nombra con una palabra clave reservada. Los valores primitivos no comparten estado con otros valores primitivos Además, scala tiene los mismos tipos de datos como Java, con el mismo espacio de memoria y precisión. A continuación se presenta el cuadro con información sobre todos los tipos de datos disponibles en Scala: byte: El tipo de dato byte es un entero de 8 bits complemento a dos. Su valor mínimo es 128 y el máximo 127 (inclusive). El tipo de datos byte se puede utilizar para ahorrar memoria en grandes arrays, donde el ahorro de memoria realmente importa. También se pueden utilizar en lugar de int donde sus límites ayudan a aclarar el código, el hecho de que el rango de una variable es limitado puede servir como una forma de documentación. short: El tipo de dato short es un entero de 16 bits complemento a dos. Su valor mínimo es -32,768 y el máximo 32,767 (inclusive). Se aplican las mismas directrices que con byte: puede utilizar short para ahorrar memoria en grandes arrays, en situaciones en las que el ahorro realmente importa. int: El tipo de dato int es un entero de 32 bits complemento a dos. Su valor mínimo es 2,147,483,648 y el máximo 2,147,483,647 (inclusive). Generalmente este tipo es la elección predeterminada para valores enteros a no ser que haya una razón (como las mencionadas anteriormente) para elegir otro. Este tipo de dato normalmente será lo suficiente grande para los números que su programa vaya a utilizar pero si necesita un rango más amplio, utilice long. long: El tipo de dato long es un entero de 64 bits complemento a dos. Su valor mínimo es 9,223,372,036,854,775,808 y el máximo 9,223,372,036,854,775,807 (inclusive). Utilice este tipo de dato cuando necesite un rango de valores más amplio que el proporcionado por int. float: El tipo de dato float es un dato en coma flotante IEEE 754 de 32 bits y precisión simple. Al igual que con byte y short, se recomienda usar un float (en vez de un double) si necesita ahorrar memoria en grandes array de números en coma flotante. Este tipo de dato nunca debería ser usado para valores precisos como, por ejemplo, divisas. double: El tipo de dato double es un dato en coma flotante IEEE 754 de 64 bits y precisión doble. Su rango de valores está fuera del ámbito de este tema, pero se detalla en la sección 4.2.3 de la Especificación del lenguaje Java. Normalmente este tipo de dato es la elección predeterminada para valores decimales. Como ya se ha mencionado, este tipo de dato no se debería utilizar para valores precisos como, por ejemplo, divisas. boolean: El tipo de dato boolean solamente tiene dos valores posibles: true (verdadero) y false (falso). Utilice este tipo de datos como conmutadores para la evaluación de condiciones verdadero/falso. Este tipo de dato representa un bit de información, pero su «tamaño» es algo que no está definido con precisión. char: El tipo de dato char es un solo carácter Unicode de 16 bits. Tiene un valor mínimo de '\u0000' (o «0») y un máximo de '\uffff' (o 65.535 inclusive). Todos los tipos de datos indicados anteriormente son objetos. No hay tipos primitivos como en Java. Esto significa que se puede llamar a métodos en un Int, Long, etc. El prefijo def, se utiliza para crear una función, ésta puede ser una función que reciba o no parámetros. Enlaces de tipos a variables. Comprobación de tipos. ¿Es su lenguaje dinámica o estáticamente tipado? Scala es de tipado estático. Scala está equipado con un sistema de tipos expresivos que refuerza a que las abstracciones de tipos se usen en forma coherente y segura. El tipado estático es cuando el chequeo de tipificación se realiza durante el tiempo de compilación, es decir, permite que los errores de programación sean detectados antes, y que la ejecución del programa sea más eficiente. ¿Es su lenguaje fuerte o débilmente tipado? Además Scala es de tipado fuerte, no se permiten violaciones de los tipos de datos, es decir, dada una variable de un tipo concreto, no se puede usar como si fuera una variable de otro tipo distinto a menos que se haga una conversión. Tiempo de vida de las variables. Como en Scala, todo se declara como un objeto, Se puede definir objeto como: “el encapsulamiento de un conjunto de operaciones (métodos), que pueden ser invocados externamente y, de un estado que recuerda el efecto de los servicios". Un objeto, además de un estado interno, presenta una interfaz para poder interactuar con el exterior. Es por esto, que se dice que en la programación orientada a objetos "se unen datos y procesos", y no como en su predecesora, la programación estructurada, en la que estaban separados en forma de variables y funciones. Un objeto consta de: Tiempo de vida: La duración de un objeto en un programa siempre está limitada en el tiempo. La mayoría de los objetos sólo existen durante una parte de la ejecución del programa. Los objetos son creados mediante un mecanismo denominado instanciación, y cuando dejan de existir se dice que son destruidos. Estado: Todo objeto posee un estado, definido por sus atributos. Con él se definen las propiedades del objeto, y el estado en que se encuentra en un momento determinado de su existencia. Comportamiento: Todo objeto ha de presentar una interfaz, definida por sus métodos, para que el resto de objetos que componen los programas puedan interactuar con él. El equivalente de un objeto en el paradigma estructurado sería una variable. Así mismo la instanciación de objetos equivaldría a la declaración de variables, y el tiempo de vida de un objeto al ámbito de una variable. Como Scala es un lenguaje que utiliza un modelo puro de orientación a objetos, el tiempo de vida de las variables, es durante el tiempo de ejecución de sus programas, además como los objetos son creados mediante el mecanismo de instanciación, cuando estos dejan de existir, éstos son destruidos. Ámbito de las variables. 1.- En el ámbito principal del intérprete se define el valor de las variables x (10) e y (20), así como la función prueba. La ejecución de prueba (3) crea un nuevo ámbito de evaluación, dentro del ámbito principal, en el que se ejecuta el cuerpo de la función. 3. En el ámbito de evaluación se liga el valor de z (argumento de prueba) con el valor 3 (parámetro con el que se realiza la llamada). 4.- En este nuevo ámbito se ejecuta el cuerpo de la función: se crea la variable local x con el valor 0 y se evalúa la expresión x+y+z. El valor de x y z están definidos en el propio ámbito local (0 y 3). El valor de y se obtiene del entorno padre: 20. El resultado es 23. 5.-En primer lugar se realizan las invocaciones a g. Cada una crea un ámbito local en el que se evalúa la función. Las invocaciones devuelven 13 y 15 respectivamente. 6.-Después se realiza la invocación a f con esos valores 13 y 15. Esta invocación vuelve a crear un ámbito local en el que se evalúa la expresión x+y+z, devolviendo 33.