如何在 Scala 中解压 Option[(Int, Int)]

Alp*_*ren 1 scala

以下是用于解压缩返回值的有效且可读的代码段。

def func: (Int, Int) = (1, 2)

val (a, b) = func
Run Code Online (Sandbox Code Playgroud)

返回的函数Option呢?例如:

def func2: Option[(Int, Int)] = Some((1, 2))
Run Code Online (Sandbox Code Playgroud)

我怎样才能以可读的方式解压它?

Mar*_*lic 5

请注意,这(Int, Int)是元组类型的糖

Tuple2[Int, Int]
Run Code Online (Sandbox Code Playgroud)

于是Option[(Int, Int)]变成

Option[Tuple2[Int, Int]]
Run Code Online (Sandbox Code Playgroud)

因此正确的语法是

val Some(Tuple2(a, b)) = func2
Run Code Online (Sandbox Code Playgroud)

或者

val Some((a, b)) = func2
Run Code Online (Sandbox Code Playgroud)

或者

val Some(a -> b) = func2
Run Code Online (Sandbox Code Playgroud)

但是请注意,如果func2返回,None则它将与MatchError. 如果我们检查类似的扩展版本,原因就很清楚了

val x: (Int, Int) = func2 match {
  case Some((a, b)) => (a, b)
  // but what about None case ??
}

val a = x._1
val b = x._2
Run Code Online (Sandbox Code Playgroud)

请注意我们没有处理None案例。由于这个原因,很少进行这种提取。通常我们会映射Option并在上下文中继续工作Option

func2.map { case (a, b) => 
  // work with a and b
}
Run Code Online (Sandbox Code Playgroud)

或者如果可能的话我们提供一些默认值

val (a, b) = func2.getOrElse((0, 0))
Run Code Online (Sandbox Code Playgroud)

  • 我认为最好多强调一下这个操作失败的可能性,我什至在一开始就提到了这一点。元组总是完整的,因此对其进行解包是有意义的。**Option** 不是,也许在答案中包含 `getOrElse` 也很好。 (4认同)