我试图为if-else表达式返回的每个值分配一个不同的变量名。这是因为我想稍后在程序中使用返回值,并且如何使用它取决于执行哪个分支(如果执行)。
例如:
if(5<1) {val x = 5;x} else {val y = 1; y}
当前输出:
res31: Int = 1
所需的输出:
y: Int = 1
谢谢
答案 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(...)
。在这种情况下,e
是Left(1)
。
值按right
,left
的顺序排列,因为它是“右偏”的,而Right
是“正常”的值,而Left
是“例外”的值值。因此,如果您使用Either
返回结果或错误条件,则按照惯例,结果将为Right(result)
,错误将为Left(error)
。 (大概是因为Right
是“正确”,所以Left
是“错误”)。
您可以将Either
视为Option
,其中Right
是Some
,但您可以使用另一个值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")
}
要使用Left
或Right
来计算值,请使用fold:
val res = e.fold(y => y + 1, x => x*2)
在这种情况下,res
是2
。令人困惑的是,此处的参数顺序为Left
,然后依次为Right
,与cond
相反。