varias strings lineas interpolated interpolaciĆ³n interpolacion ecmascript concatenar scala char int variable-assignment

scala - strings - string en varias lineas javascript



Comportamiento de Scala al asignar literales o variables a Char (2)

Hay una regla especial para escribir literales en la especificación .

Sin embargo, si el tipo de pt esperado de un literal en una expresión es Byte, Short o Char y el número entero cabe en el rango numérico definido por el tipo, entonces el número se convierte en tipo pt y el tipo del literal es pt.

Eso te permite escribir:

scala> 97 : Char res0: Char = a scala> 97 + 1 : Char res1: Char = b

A escondidas, significan expresiones constantes aquí. Pero la definición de expresión constante es específica de la plataforma, por lo que técnicamente res1 también podría fallar en la compilación si no se dobla constantemente.

Una pregunta relacionada con el plegado constante en scaladoc muestra la extraña pérdida de comprobación de tipo bajo scaladoc:

$ ~/scala-2.12.3/bin/scaladoc -d /tmp folded.scala folded.scala:9: error: type mismatch; found : Int required: Char x = ''a'' - 32 + 5 ^ model contains 4 documentable templates one error found

En Scala, si tengo una declaración de variable, por ej.

var x: Char = ''a''

Si intento actualizar este personaje agregando 1, por ejemplo

x = x + 1

Obtengo un error de compilación: No coinciden los tipos, se encuentra Int requerido Char. Sin embargo, puedo hacer esto sin un error de compilación:

x = ''a'' + 1

Supongo que esto tiene algo que ver con valores literales vs objetos, sin embargo, estoy tratando de entender el comportamiento exacto. Puede asignar claramente un entero literal a un Char, por ejemplo, 97, y también puede asignar el resultado de 97-32. Sin embargo, si digo 97-32 + 5, aparece un error de desajuste de tipo. ¿En qué punto el compilador diferencia entre una expresión que da como resultado un literal frente a uno que da como resultado un objeto?


La asignación es la clave aquí. Mire la siguiente sesión REPL:

alex@POSITRON ~ $ scala Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131). Type in expressions to have them evaluated. Type :help for more information. scala> val x:Char = ''a'' x: Char = a scala> x + 1 res0: Int = 98 scala> var y:Char = ''a'' y: Char = a scala> y + 1 res1: Int = 98 scala> y = y + 1 <console>:8: error: type mismatch; found : Int required: Char y = y + 1 ^ scala>

Como puede ver, a menos que trate de reasignar los valores variables, todo va bien. Cuando escribe ''a''+1 o x + 1 , se convierte a Int . Entonces, cuando finalmente intenta reasignar x = x + 1 , está tratando de asignar un valor Int a la variable Char . Esto explica por qué ocurre el error de compilación.

En el objeto complementario Char hay implicit def char2int(x: Char): Int método implicit def char2int(x: Char): Int . Creo que en var x:Char = ''a'' + 1 lo primero que sucede es invocar este método para convertir ''a'' a 97. Luego 97 se agrega 1, ambos como Int s. Entonces la variable x se instancia de la misma manera que en val y:Char = 98 . Esto creo que explica cómo funciona la inicialización variable.