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}
Run Code Online (Sandbox Code Playgroud)
以上编译.理想情况下,我只想写:
type CanvNode = Either[CSplit, MapCanvT]
class CSplit(var s1: CanvNode, var s2: CanvNode) extends SplitPane
{
topComponent = s1
bottomComponent = s2
Run Code Online (Sandbox Code Playgroud)
但那不会编译.
fold实际上会在这里做你想做的事.你可以改写这个:
topComponent = s1 match { case Left (s) => s; case Right (s) => s}
Run Code Online (Sandbox Code Playgroud)
这样:
topComponent = s1.fold(identity, identity)
Run Code Online (Sandbox Code Playgroud)
和推断出的类型将是最小上界的CSplit和MapCanvT.
Either 还提供了一种稍微更紧凑的方式来写这个:
topComponent = s1.merge
Run Code Online (Sandbox Code Playgroud)
通过隐式转换为MergeableEither.
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |