如何从scala中的if块返回值

时间:2015-02-13 09:09:47

标签: scala

我想从if块中返回一个整数类型,如下面的示例代码所示:

def a {
  val res = if (1 == 1) {
    val x = 1
    b(x)
  }
}

def b(x:Int) = {
  20
}

此处res的类型为val res: AnyVal

如何将其更改为Int

4 个答案:

答案 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案例编译器使用UnitIntUnit的最近常见类型为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部分。