查看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
}
我对案例类的理解是这个签名无效,因为:
有人可以向我解释这是如何运作的吗?
答案 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