【问题标题】:Scala abstract classesScala 抽象类
【发布时间】:2017-09-10 07:36:13
【问题描述】:

我正在学习 Coursera 的 Scala 课程,但在抽象类方面遇到了一些问题。在这里,我试图从 CodeTree 抽象类的案例类中访问字段,但编译器抱怨这些字段不属于 CodeTree 类本身。我认为模式匹配会解决这个问题,但显然它没有。有什么帮助吗?

abstract class CodeTree
case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree
case class Leaf(char: Char, weight: Int) extends CodeTree

def weight(tree: CodeTree): Int = tree match {
  case Leaf(_, weight) => tree.weight
  case Fork(left, right, _, _) => weight(tree.left) + weight(tree.right)
}

【问题讨论】:

    标签: scala abstract-class case-class


    【解决方案1】:

    编译器是对的,你的抽象类没有实例变量。

    好消息是您不需要它们,您已经从 tree 输入参数的模式匹配中获得了所需的一切。

    只需将您的代码修改为:

    abstract class CodeTree
    case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree
    case class Leaf(char: Char, weight: Int) extends CodeTree
    
    def weight(tree: CodeTree): Int = tree match {
      case Leaf(_, weight) => weight
      case Fork(left, right, _, _) => weight(left) + weight(right)
    }
    

    当您在 Scala 中成功进行模式匹配时,匹配子句左侧的变量可用于子句本身的右侧,因此:

    • 在您的第一个子句中,您匹配一个 Leaf,因此右侧有一个可用的 weight 变量,它只是返回它
    • 在您的第二个子句中,您匹配一个Fork,因此右侧有一个leftright 变量可用(您丢弃charsweight 变量),递归调用@ 987654331@函数

    您可以参考Scala Tour 以更好地了解模式匹配的工作原理。

    【讨论】:

    • 我添加了一些链接和一些关于正在发生的事情的解释。我知道 Scala 一开始可能很奇怪。 :)
    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    相关资源
    最近更新 更多