Scala 类型不匹配-返回的单位类型是什么?

Scala 类型不匹配-返回的单位类型是什么?,scala,Scala,我犯了这样的错误 var v1 = 1 v1 = if(v1 != 0) 0; println(v1) 那么,什么是返回的Unit类型?这是“如果”的表达吗?我希望程序打印“0”。这是因为当您使用 v1=if(v1!=0)0如果不满足条件,它仍在尝试将v1分配给表达式。尝试将代码更改为 如果(v1!=0)v1=0 scala中的Unit有点像java中的void 您之所以会遇到这种类型错误,是因为Scala强大的类型系统抓住了一个您已经忘记的关键案例。让我们仔细检查每一行 [error] /

我犯了这样的错误

var v1  = 1
v1 = if(v1 != 0) 0;
println(v1)

那么,什么是返回的
Unit
类型?这是“如果”的表达吗?我希望程序打印“0”。

这是因为当您使用
v1=if(v1!=0)0如果不满足条件,它仍在尝试将
v1
分配给表达式。尝试将代码更改为

如果(v1!=0)v1=0


scala中的
Unit
有点像java中的
void

您之所以会遇到这种类型错误,是因为Scala强大的类型系统抓住了一个您已经忘记的关键案例。让我们仔细检查每一行

[error] /Users/hoge/project/hello.scala:62: type mismatch;
[error]  found   : Unit
[error]  required: Int
[error]         v1 = if(v1 != 0) 0;
[error]              ^
这里我们声明了一个名为
v1
var
,类型为
Int

scala> var v1 = 1
v1: Int = 1
哦,我们有一个类型错误。我们试图将
if(v1!=0)0的结果分配给
v1
,因此
if
表达式的类型最好是
Int
(请记住,
v1:Int
)。但是如果
v1==0
,即采用隐式
else
分支,会发生什么

Scala将
else
分支的结果默认为
Unit
,因此在本例中,它将返回
Unit
。显然,我们不能将
Unit
赋值给
Int
类型的值,因此编译器有理由抱怨


要修复此错误,请使用默认的
Int
值填充缺少的
else
分支,或者将
v1
的赋值移动到分支内部,就像这样
if(v1!=0)v1=0

谢谢:)在我的理解中,if表达式在Scala中返回一些值。所以我期望
如果(v1!=0)0
应该返回
0
right?顺便说一句,这是有效的。var v1=1 val v2=if(v1!=0)0;这仍然存在同样的问题。v2可以是0或单位,因为您没有else子句。看cdk的回答,我明白了<代码>值v2=if(v1!=0)0
return
AnyVal
,但是当
val v4=if(v1!=0)0 else 1时,我得到了
Int
如你所说。有道理!“Scala将else分支的结果默认为Unit”
scala> v1 = if (v1 != 0) 0;
error: type mismatch;
found    : Unit
required : Int
    v1 = if (v1 != 0) 0