以下是用于解压缩返回值的有效且可读的代码段。
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)
我怎样才能以可读的方式解压它?
请注意,这(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)