如何使用if else表达式在Scala中分配不同的变量名称

时间:2018-08-01 16:41:53

标签: scala if-statement

我试图为if-else表达式返回的每个值分配一个不同的变量名。这是因为我想稍后在程序中使用返回值,并且如何使用它取决于执行哪个分支(如果执行)。

例如:

if(5<1) {val x = 5;x} else {val y = 1; y}

当前输出:

res31: Int = 1

所需的输出:

y: Int = 1

谢谢

2 个答案:

答案 0 :(得分:1)

如何使用Option来跟踪您的计算结果?

scala 2.13.0-M4> val (x,y) = if (true) (Some(42), None) else (None, Some(17))
x: Option[Int] = Some(42)
y: Option[Int] = None

scala 2.13.0-M4> x.map(_ + 1).orElse(y.map(_ * 2))
res0: Option[Int] = Some(43)

scala 2.13.0-M4> val (x,y) = if (false) (Some(42), None) else (None, Some(17))
x: Option[Int] = None
y: Option[Int] = Some(17)

scala 2.13.0-M4> x.map(_ + 1).orElse(y.map(_ * 2))
res1: Option[Int] = Some(34)

答案 1 :(得分:1)

这是如何使用Either来执行此操作,如各种注释所述。

根据条件创建Either的实例:

val e = Either.cond(5 < 1, 5, 1)

根据情况,该值为Right(...)Left(...)。在这种情况下,eLeft(1)

值按rightleft的顺序排列,因为它是“右偏”的,而Right是“正常”的值,而Left是“例外”的值值。因此,如果您使用Either返回结果或错误条件,则按照惯例,结果将为Right(result),错误将为Left(error)。 (大概是因为Right是“正确”,所以Left是“错误”)。

您可以将Either视为Option,其中RightSome,但您可以使用另一个值None来代替Left。像foreach / contains / exists这样的方法仅在值为Right时才起作用。 Try类型具有方法toEither,该方法将返回Right(success)Left(exception)

要取消选择该值,请使用match语句:

e match {
  case Right(x) =>
    println(s"Right: x=$x")
  case Left(y) =>
    println(s"Left: y=$y")
}

要使用LeftRight来计算值,请使用fold:

val res = e.fold(y => y + 1, x => x*2) 

在这种情况下,res2。令人困惑的是,此处的参数顺序为Left,然后依次为Right,与cond相反。