gpt4 book ai didi

Scala:访问Either的公共(public)子类型

转载 作者:行者123 更新时间:2023-12-01 09:00:03 26 4
gpt4 key购买 nike

CSplit 和 MapCanvT 都是 Scala Swing 组件的子类型。所以 CanvNode 类型总是 Component 的子类型。我还没有掌握 Scala 集合的功能性内容,比如 fold。有什么方法可以减少此代码(除了将匹配放在函数中)并删除这些匹配吗?

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

但这不会编译。

最佳答案

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

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

像这样:

topComponent = s1.fold(identity, identity)

并且推断类型将是CSplitMapCanvT 的最小上限。

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

topComponent = s1.merge

通过隐式转换为 MergeableEither .

关于Scala:访问Either的公共(public)子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12064956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com