同为Int类型,Scala中var变量与val值为何方法不同?
Scala中var与val的+=方法差异机制解析
先看两个变量声明:
var x: Int = 0 val y: Int = 0
其中x是变量(variable),y是值(value),二者的类型都是Int。
可以对x执行+=操作:
x += 1 x.+=(1)
但对y执行+=时会触发编译错误(错误码E008),错误描述为:
+=is not a member ofInt
下面解释背后的机制:
Scala的原生值类型(比如Int)本身是不可变的,类中根本没有定义+=这种修改自身的方法。
针对var变量的+=操作,是Scala编译器提供的语法糖:当编译器遇到x += 1时,会自动将其转换为x = x + 1——本质是计算出x+1的新值,再重新赋值给可变变量x。而x.+=(1)只是这种语法糖的另一种写法,底层逻辑还是重新赋值。
而对于val常量,因为它的核心特性是不可重新赋值,编译器不会允许对它执行赋值操作。同时由于Int类本身没有+=方法,当你尝试调用y += 1时,编译器会直接去查找Int的+=方法,自然找不到,于是抛出了上述错误。
总结来说:
var的+=是编译器做的语法糖,本质是重新赋值val既不允许重新赋值,对应类型也没有+=方法,因此报错
内容的提问来源于stack exchange,提问作者jfMR
相关产品推荐
相关产品推荐

