【问题标题】:Naming case classes in Scala在 Scala 中命名案例类
【发布时间】:2011-02-17 06:11:25
【问题描述】:

我倾向于在案例类中使用这种冗余命名:

abstract class MyTree
case class MyTreeNode (...)
case class MyTreeLeaf (...)

难道不能在MyTree的inside中定义Node和Leaf吗? 这里有哪些最佳做法?

【问题讨论】:

    标签: scala scala-2.8 case-class


    【解决方案1】:

    我不建议将案例类放在它们的抽象超类中,因为嵌套类在 Scala 中是路径相关的。如果有的话,您可以将它们放在伴随对象中。

    abstract class MyTree
    object MyTree {
      case class Node (...) extends MyTree
      case class Leaf (...) extends MyTree
    }
    

    (注意:我还没有测试过这个......)

    【讨论】:

      【解决方案2】:

      由于类、特征和对象名称是包作用域的,为什么不使用包来防止与其他节点和叶发生别名,并简单地将它们称为NodeLeaf,同时将它们放在任何其他作用域构造之外(即,一个对象)?

      【讨论】:

      • 包和伴生对象有什么区别?
      • 包对象是可以容纳任何类型的 Scala 实体的范围,尤其是那些由于 JVM 限制而不能真正出现在顶层/全局的范围。您可以将defval(或var)和type 声明放在包对象中,但只能将特征、类和对象放在顶层。伴侣是类/对象对(共享一个名称)并且在同一个源文件中定义。同伴可以访问彼此的私人成员。
      猜你喜欢
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多