我想从if块中返回一个整数类型,如下面的示例代码所示:
def a {
val res = if (1 == 1) {
val x = 1
b(x)
}
}
def b(x:Int) = {
20
}
此处res的类型为val res: AnyVal
如何将其更改为Int
?
答案 0 :(得分:6)
如果您没有要返回的默认值,则可以返回Option[Int]
,然后将其与getOrElse
结合使用:
def a(n: Int): Option[Int] = {
if (n < 100) {
Some(n * 2)
} else {
None
}
}
a(10).getOrElse("Something else")
另一种可能性是使用部分功能,因为在您的情况下,您的第一个功能并未涵盖所有情况,并且您希望获得后备:
val a: PartialFunction[Int, Int] = {
case n if n < 100 =>
n * 2
}
val b: PartialFunction[Int, String] = {
case _ =>
"Something else"
}
然后您可以使用applyOrElse
:
// If function a is not defined for the input, then call function b
val result = a.applyOrElse(10, b)
或将两个部分函数合并到另一个函数中,然后调用它:
// Combine a and b
val cf = a.orElse(b)
// Call
val result = cf(10)
答案 1 :(得分:4)
您必须添加else
替代方案,例如:
def a {
val res = if (1 == 1) {
val x = 1
b(x)
} else 0
}
这是因为缺少else
案例编译器使用Unit
。 Int
和Unit
的最近常见类型为AnyVal
。
答案 2 :(得分:0)
你没有得到确定的int的原因是:你的if块错过了一些代码路径。所以,如果你改为:
val res = if (i == 1) {
val x = 1
b(x)
} else {
0 // some default value
}
那没关系。
答案 3 :(得分:0)
要使用val res
表达式明确定义不可变值if-else
,需要声明表达式的两个部分,如前所述。即使在可变变量的情况下
var res: Int = _
编译器将其实例化为默认0
。此后它有效,例如
if (1 == 1) res = 20
无需定义else
部分。