3

CSplit 和 MapCanvT 都是 Scala Swing 组件的子类型。所以 CanvNode 类型始终是 Component 的子类型。我还没有掌握 Scala 集合的功能性东西,比如折叠。有没有办法减少这段代码(除了把匹配放在一个函数中)并摆脱那些匹配?

type CanvNode = Either[CSplit, MapCanvT]   

class CSplit(var s1: CanvNode, var s2: CanvNode) extends SplitPane
{         
  topComponent =  s1 match { case Left (s) => s; case Right (s) => s} 
  bottomComponent = s2 match { case Left (s) => s; case Right (s) => s}

以上编译。理想情况下,我会写:

type CanvNode = Either[CSplit, MapCanvT]   

class CSplit(var s1: CanvNode, var s2: CanvNode) extends SplitPane
{         
  topComponent =  s1
  bottomComponent = s2

但这不会编译。

4

2 回答 2

6

fold实际上会在这里做你想做的事。你可以重写这个:

topComponent = s1 match { case Left (s) => s; case Right (s) => s}

像这样:

topComponent = s1.fold(identity, identity)

CSplit并且推断的类型将是和的最小上限MapCanvT

Either还提供了一种更紧凑的编写方式:

topComponent = s1.merge

通过隐式转换为MergeableEither.

于 2012-08-22T01:04:43.910 回答
0

为什么不以不同的方式将其建模为特征呢?

sealed trait CanvNode
class MapCanvT extends Component with CanvNode
class CSplit extends SplitPane with CanvNode(var s1: CanvNode,
                                             var s2: CanvNode) {
    topComponent = s1
    bottomCompoenent = s2
}
于 2012-08-22T10:44:58.517 回答