如何从scala中的if块返回值

GKV*_*GKV 0 scala

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

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

def b(x:Int) = {
  20
}
Run Code Online (Sandbox Code Playgroud)

这里res的类型是 val res: AnyVal

我怎样才能改成它Int

Ber*_*ium 6

如果您没有要返回的默认值,那么您可以返回一个Option[Int],然后将其与getOrElse:

def a(n: Int): Option[Int] = {
  if (n < 100) {
    Some(n * 2)
  } else {
    None
  }
}

a(10).getOrElse("Something else")
Run Code Online (Sandbox Code Playgroud)

另一种可能性是使用部分函数,因为在您的情况下,您的第一个函数不会涵盖所有情况,并且您希望有一个后备:

val a: PartialFunction[Int, Int] = {
  case n if n < 100 =>
    n * 2
}

val b: PartialFunction[Int, String] = {
  case _ =>
    "Something else"
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用applyOrElse:

// If function a is not defined for the input, then call function b
val result = a.applyOrElse(10, b)
Run Code Online (Sandbox Code Playgroud)

或者将两个部分函数合并到另一个函数中,并调用它:

// Combine a and b
val cf = a.orElse(b)
// Call
val result = cf(10)
Run Code Online (Sandbox Code Playgroud)


use*_*379 5

您必须添加else替代品,例如:

  def a {
    val res = if (1 == 1) {
      val x = 1
      b(x)
    } else 0
  }
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为对于不存在的else情况,编译器使用Unit. 而最近的常见类型IntUnitAnyVal

  • 那么结果类型将是`Any`。如果表达式的任何分支不是“Int”类型,则您无法将表达式计算为“Int”。 (2认同)