Red de conocimiento informático - Material del sitio web - Cómo usar expresiones condicionales en Scala

Cómo usar expresiones condicionales en Scala

Expresión condicional

La estructura de sintaxis if/else de Scala es la misma que la de Java o C++. Sin embargo, en Scala, las expresiones if/else tienen un valor, que es el valor de la expresión que sigue a if o else. Por ejemplo:

if(x>0) 1 en caso contrario-1

¿El valor de la expresión anterior es 1 o? 1, depende del valor de x. Puedes asignar el valor de una expresión if/else a una variable:

val s = if(x>0) 1 else -1

Esto tiene el mismo efecto que lo siguiente declaración Mismo efecto:

if(x>0) s = 1 de lo contrario s = -1

Sin embargo, el primer método es mejor porque se puede utilizar para inicializar val. En la segunda forma, s debe ser var.

(Como se mencionó anteriormente, los puntos y coma en Scala son innecesarios en la mayoría de los casos.)

¿Existe uno para Java y C++? El operador :también se utiliza para el mismo propósito. La siguiente expresión

x & gt0 ?1: -1 // Java o C++

¿Es equivalente a la expresión de Scala si (x > 0) 1 más? 1. ¿Pero no puedes ir? : Inserta declaraciones en expresiones. El if/else de Scala se dividirá en dos estructuras gramaticales: if/else y? : Combinados juntos.

En Scala, cada expresión tiene un tipo. Por ejemplo, la expresión if(x>0) 1 ¿algo más? El tipo de 1 es Int, porque los tipos de ambas ramas son Int. Expresiones mixtas, por ejemplo:

if (x & gt; 0) "positivo" else -1

El tipo de la expresión anterior es el supertipo común de los dos tipos de rama. En este caso, una rama es java.lang.String y la otra rama es Int. Su supertipo masculino se llama Any. (Consulte la Sección 8.11 para obtener más detalles).

Por ejemplo, si falta la parte else:

if(x>0) 1

entonces es posible que la declaración if No tiene valor de salida. Pero en Scala, cada expresión debería tener algún valor. La forma de resolver este problema es introducir una clase unitaria, escrita como (). La declaración if sin else es equivalente a

if(x>0) 1 else()

En Java o C++, puedes pensar en () como un marcador de posición "sin valor útil". , tratando la Unidad como nula. (Técnicamente hablando, void no tiene valor, pero Unit tiene valor, lo que significa "sin valor". Si debes profundizar más, es como la diferencia entre una billetera vacía y una billetera sin billetes sin denominación escrita en su interior).

Descripción: Scala no tiene una declaración de cambio, pero tiene un mecanismo de coincidencia de patrones más poderoso, que veremos en el Capítulo 14. En esta etapa, simplemente use una serie de declaraciones if.

Nota: El REPL es más "miope" que el compilador: sólo puede ver una línea de código a la vez.

Por ejemplo, cuando escribes el siguiente código:

if(x>0) 1

else if (x == 0) 0 else - 1

REPL se ejecutará si (x > 0) 1 y luego mostrará el resultado. Entonces se sentirá perdido cuando vea la siguiente palabra clave else.

Si quieres romper la línea antes que else, usa llaves:

if(x>0) { 1

} else if (x = = 0) 0 else -1

Este tipo de preocupación solo ocurre en REPL. En el programa compilado, el analizador encuentra el else en la siguiente línea.

Consejo: Si desea pegar un bloque de código en REPL sin preocuparse por la miopía de REPL, puede usar el modo pegar. Escriba:

:Pegar

Pegue el bloque de código y presione CTRL+D. De esta forma, REPL analizará el bloque de código en su conjunto.

Terminación de declaración

En Java y C++, cada declaración termina con un punto y coma. En Scala, similar a JavaScript y otros lenguajes de programación, no es necesario un punto y coma al final de la línea. De manera similar, no es necesario escribir punto y coma en }, else y otros lugares similares, siempre que se pueda juzgar claramente por el contexto que esta es la terminación de la declaración.

Sin embargo, si desea escribir varias declaraciones en una línea, debe separarlas con punto y coma. Por ejemplo:

If (n & gt0){ r = r * n; n -= 1 }

Necesitamos un punto y coma para separar r = r * n y n -= 1. Debido a }, no es necesario escribir un punto y coma después de la segunda declaración.

Si estás escribiendo una oración larga y necesitas escribirla en dos líneas, asegúrate de que la primera línea termine con un símbolo que no finalice la oración. En general, una mejor opción es el operador:

s = s(v-v 0)* t+ //+ le dice al analizador que este no es el final de la declaración.

0.5 * (a - a0) * t * t

En la codificación real, las expresiones largas generalmente implican llamadas a funciones o métodos, por lo que no hay necesidad de preocuparse demasiado - en Después el corchete de apertura, el compilador no infiere si algo es el final de una declaración hasta que ve una coincidencia.

Por esta razón, los programadores de Scala prefieren usar llaves estilo Kernighan & Ritchie:

if (n & gt0) {

r = r * n

n -= 1

}

Las líneas que terminan en { indican claramente que hay más.

Muchos programadores que vienen de Java o C++ no están acostumbrados a omitir el punto y coma al principio. Si le gusta usar punto y coma, utilícelos; no hacen ningún daño.

Expresiones de bloque y asignaciones

En Java o C++, una declaración de bloque es una serie de declaraciones encerradas entre {}. La declaración de bloque se puede utilizar siempre que sea necesario colocar varias operaciones en una rama o bucle lógico.

En Scala, el bloque {} contiene una serie de expresiones y el resultado también es una expresión. El valor de la última expresión de un bloque es el valor del bloque.

Esta función es muy útil cuando la inicialización de val debe completarse en varios pasos. Por ejemplo,

val distancia = { val dx = x-x0; val dy = y-y0; dx * dx + dy * dy) }

{} bloque toma el valor de su última expresión, marcada aquí en negrita. Las variables dx y dy solo se utilizan como valores intermedios necesarios para los cálculos y son completamente invisibles para otras partes del programa.

En Scala, las operaciones de asignación en sí mismas no tienen valor o, más estrictamente hablando, sus valores son de tipo Unidad. Hay que recordar que en Java y C++, el tipo de unidad es equivalente a void, que tiene un solo valor, escrito como ().

El valor de un bloque que termina con una declaración de asignación, como

{ r = r * n -= n -= 1}

, pertenece a el tipo de unidad. Esto está bien, pero debemos ser conscientes de ello al definir funciones.

Debido a que el valor de la declaración de asignación es de tipo Unidad, no los encadene.

X = y = 1 //No hagas esto.

El valor de y = 1 es (). Es casi imposible asignar un valor de tipo Unidad a x (en consecuencia, en Java y C++, el valor de la declaración de asignación es el valor asignado. En estos lenguajes, tiene sentido concatenar declaraciones de asignación)

Entrada y Salida

Si queremos imprimir un valor, usamos la función print o println. Este último agregará un carácter de nueva línea después del contenido impreso.

Por ejemplo,

print("Respuesta: ")

println(42)

Tiene el mismo resultado que el siguiente código:

println("Respuesta: "+ 42)

Además, hay una función printf con cadenas formateadas estilo C:

printf("¡Hola, %s! Ya %d años. \n", "Fred", 42)

Puedes usar la función readLine para leer una línea de entrada desde la consola. Si desea leer números, valores booleanos o caracteres, puede utilizar readInt, readDouble, readByte, readShort, readLong, readFloat, readBoolean o readChar. A diferencia de otros métodos, readLine toma parámetros como cadenas de mensaje:

val nombre = readLine("Tu nombre: ")

print("Tu edad: ")

p>

val edad = readInt()

printf("¡Hola, %s! El año que viene, serás %d,\n ", nombre, edad + 1)