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

标签 scala char int variable-assignment

在 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重新分配然后您尝试分配 IntChar多变的。这解释了为什么会出现编译错误。

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/

相关文章:

scala - 使用 Immutability + Actor 模型进行并发编程有哪些弱点?

objective-c - 在没有 initWithCString 的情况下将 char* 转换为 NSString 的正确方法?

php - 为什么 1024 * 1024 * 1024 * 1024 * 1024 返回 float ?

scala - 为什么部分应用函数会延迟 Scala 中的类实例化?

scala - 为什么在流数据集上使用缓存会失败并显示 "AnalysisException: Queries with streaming sources must be executed with writeStream.start()"?

Scala:为什么不能编译?

java - 字符匹配 DNA 程序

c - 奇怪的返回;返回 int 的函数的行

c++ - 确定两个整数的幂指数?

java - 获取由 int 0-25 表示的字符