在 Scala 中,如果我有一个变量声明,例如
var x: Char = 'a'
如果我然后尝试通过添加 1 来更新此字符,例如
x = x + 1
我收到编译错误:类型不匹配,发现 Int 需要 Char。但是,我可以在没有编译错误的情况下执行此操作:
x = 'a' + 1
我猜这与文字值与对象有关,但是,我正在尝试了解确切的行为。您可以明确地将文字整数分配给 Char,例如97,也可以赋值97-32的结果。但是,如果我说 97-32+5,则会出现类型不匹配错误。编译器在什么时候区分产生文字的表达式和产生对象的表达式?
最佳答案
赋值是这里的关键。 查看以下 REPL session :
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>
正如您所看到的,除非您尝试重新分配变量值,否则一切都会正常。当你写'a'+1
时或x + 1
它被转换为Int
。
所以当你最终尝试 x = x + 1
重新分配然后您尝试分配 Int
值 Char
多变的。这解释了为什么会出现编译错误。
在 Char
伴随对象有implicit def char2int(x: Char): Int
方法。
我认为在var x:Char = 'a' + 1
首先发生的是调用此方法将 'a' 转换为 97。然后 97 加 1,两者均为 Int
s。然后变量 x
以与 val y:Char = 98
中相同的方式实例化。我认为这解释了变量初始化的工作原理。
关于将文字或变量分配给 Char 时的 Scala 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45486994/