代码之家  ›  专栏  ›  技术社区  ›  dsaxton

Scala抽象类

  •  0
  • dsaxton  · 技术社区  · 7 年前

    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)
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Vincenzo Maggio    7 年前

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

    好消息是,您不需要它们,您已经从 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 所以你有一个 left right 右侧可用的变量(您放弃 chars 重量 变量),递归调用 重量

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