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

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

var x: Char = 'a'

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

x = x + 1

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

x = 'a' + 1

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

解决方法

作业是关键.
查看以下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>

因此,除非您尝试重新分配变量值,否则一切正常.当你写’a’1或x 1时,它会转换为Int.
因此,当您最终尝试x = x 1重新分配时,您将尝试将Int值分配给Char变量.这解释了为什么会出现编译错误.

在Char伴侣对象中有隐式def char2int(x:Char):Int方法.我认为在var x:Char =’a’1中,首先发生的是调用此方法将’a’转换为97.然后将97添加为1,两者都作为Ints.然后变量x以与val y中相同的方式实例化:Char = 98.我想解释变量初始化是如何工作的.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...