模式匹配::案例类

时间:2015-12-11 22:13:51

标签: scala

查看immutable.List的源代码,我看到了这个

final case class ::[B](override val head: B,
                       private[scala] var tl: List[B]) extends List[B] {
    override def tail : List[B] = tl
    override def isEmpty: Boolean = false
}

我对案例类的理解是这个签名无效,因为:

  • 构造函数参数不是全部公开的
  • 构造函数参数不是所有的vals

有人可以向我解释这是如何运作的吗?

2 个答案:

答案 0 :(得分:3)

不禁止构造函数参数是非公共的。提取器仍然可以工作。它被设为私有的原因正是因为它是一个变量,因此用户无法改变该值(但只能通过"<br>", "\n"方法读取它)。这不是禁止的,但通常强烈劝阻。您通常不应该使用tail,因为案例类&#39;等式和哈希码取决于构造函数参数。

List在这里使用var只是为了更容易组合新列表。如果您查看源代码,可以在this link中看到这一点。您还可以看到var仅在构建新列表时在内部分配。返回后,该变量不再被触及,因此不会破坏相等。

答案 1 :(得分:1)

“默认情况下”缺少您的假设。 默认情况下构造函数参数是val和public。 也就是说,如果你说$ ./script.sh 1 a 2 b 3 c 4 d ,那将case class Foo(bar: String)成为bar并公开。不代表,你不能说val