应用或操作选项结果

Ric*_*ver 0 scala scala-option

我有以下代码:

class CSplit(var s1: CanvNode, var s2: CanvNode) extends SplitPane
{         
   topComponent =  s1.merge
   bottomComponent = s2.merge
   def containsV(orig: MapCanvT): Option[MapCanvT]  = 
   {
      def containsIn(cn: CanvNode): Option[MapCanvT] = cn match
      {  
        case Left => None 
        case Right(mc) => if (mc == orig) Some(mc) else None                 
      }
      containsIn(s1) match
      {
        case Some(mc) => Some(mc)
        case None => containsIn(s2)
      }
    }
 }
Run Code Online (Sandbox Code Playgroud)

我想减少containsV方法的代码.我的第一个想法是使用fold方法来缩短containsIn方法.但Option没有一个,也没有扩展Class Either.Option [T]不应该扩展[T,None]吗?然后至少有一个可以使用Either的折叠方法.

我最后的想法是将s1和s2视为一个List并找到它但我无法编译:

def containsV(orig: MapCanvT):
  Option[MapCanvT] = ::[CanvNode](s1, s2).find(_ == Right(orig))      
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 5

Scala 2.10增加foldOption.在此期间,您可以使用map(f).getOrElse(g):

// These produce identical results
o.fold(g)(x => f(x))
o.map(x => f(x)).getOrElse(g)
Run Code Online (Sandbox Code Playgroud)

编辑:所以,例如,以下三个做同样的事情:

val os: List[Option[Int]] = List(Some(5),None)

// Explicit match
os.map{ _ match {
  case Some(x) => x+3
  case None => 0
}}

// map+getOrElse
os.map{ _.map(_+3).getOrElse(0) }

// fold
os.map{ _.fold(0)(_+3) }
Run Code Online (Sandbox Code Playgroud)

在这种fold情况下,首先给出案例的默认值None,然后是处理有值的案例的函数.在每种情况下你都应该得到List(8,0).