将文字或变量分配给Char时的Scala行为

Tra*_*ity 6 int scala char variable-assignment

在Scala中,如果我有变量声明,例如

var x: Char = 'a'
Run Code Online (Sandbox Code Playgroud)

如果我然后尝试通过添加1来更新此字符,例如

x = x + 1
Run Code Online (Sandbox Code Playgroud)

我收到编译错误:输入不匹配,找到Int必需的Char.但是,我可以在没有编译错误的情况下执行此操作:

x = 'a' + 1
Run Code Online (Sandbox Code Playgroud)

我猜这与文字值和对象有关,但是,我试图弄清楚确切的行为.您可以清楚地为字符整数分配一个字符,例如97,您也可以分配97-32的结果.但是,如果我说97-32 + 5然后我得到类型不匹配错误.编译器在什么时候区分导致文字的表达式与导致对象的表达式?

Ale*_*dar 1

分配是这里的关键。查看以下 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> 
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,除非您尝试重新分配变量值,否则一切都会正常。当您编写'a'+1x + 1它被转换为Int. 因此,当您最终尝试x = x + 1重新分配时,您正在尝试Int为变量分配值Char。这解释了为什么会出现编译错误。

伴随对象中Charimplicit def char2int(x: Char): Int方法。我认为var x:Char = 'a' + 1发生的第一件事是调用此方法将“a”转换为 97。然后 97 加 1,两者都作为Ints。然后该变量x以与 中相同的方式实例化val y:Char = 98。我认为这解释了变量初始化的工作原理。