0

私は次のコードを持っています:

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)
      }
    }
 }

containsVメソッドのコードを減らしたい。私が最初に考えたのは、foldメソッドを使用してcontainsInメソッドを短縮することでした。しかし、Optionには1つもありませんし、ClassEitherを拡張することもありません。Option [T]はEither[T、None]を拡張すべきではありませんか?次に、少なくとも1つはEitherのfoldメソッドを使用できます。

私の最終的な考えは、s1とs2をリストとして扱い、それを見つけることでしたが、これをコンパイルすることはできません。

def containsV(orig: MapCanvT):
  Option[MapCanvT] = ::[CanvNode](s1, s2).find(_ == Right(orig))      
4

3 に答える 3

5

Scala2.10はに追加foldOptionます。map(f).getOrElse(g)それまでの間、代わりに次を使用できます。

// These produce identical results
o.fold(g)(x => f(x))
o.map(x => f(x)).getOrElse(g)

編集:たとえば、次の3つは同じことを行います。

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) }

このfold場合、最初にケースのデフォルト値を指定し、None次に値がある場合にケースを処理する関数を指定します。いずれの場合も、を取得する必要がありますList(8,0)

于 2012-08-23T22:08:48.187 に答える
2

collectFirstメソッドを使用してリストで実装できます

def containsV(orig: MapCanvT): Option[MapCanvT]
  = List(s1, s2).collectFirst {case i: MapCanvT if (i == (orig) => i}    
于 2012-08-26T08:14:02.290 に答える
1

簡単な部分から始めましょう:

  containsIn(s1) match
  {
    case Some(mc) => Some(mc)
    case None => containsIn(s2)
  }

と同じです

  containsIn(s1) orElse containsIn(s2)

今、私たちは対処する必要があるだけcontainsInです:

  def containsIn(cn: CanvNode): Option[MapCanvT] = cn match
  {  
    case Left => None 
    case Right(mc) => if (mc == orig) Some(mc) else None                 
  }

で使用できます。これにより、パターンマッチングのほとんどが削除foldされます。Either

 cn.fold(_ => None, Some(_))

しかし、orig物事があります。ただし、フィルターを使用して処理できます。

 cn.fold(_ => None, Some(_)) filter (orig.==)

したがって:

def containsV(orig: MapCanvT): Option[MapCanvT]  = {
  def containsIn(cn: CanvNode): Option[MapCanvT] =
    cn.fold(_ => None, Some(_)) filter (orig.==)
  containsIn(s1) orElse containsIn(s2)
}

orElse見落とされがちだと思います。

于 2012-08-23T22:27:08.043 に答える