Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 私有[this]w/案例类参数_Scala - Fatal编程技术网

Scala 私有[this]w/案例类参数

Scala 私有[this]w/案例类参数,scala,Scala,鉴于: $scala 欢迎使用Scala 2.11.8(Java热点(TM)64位服务器虚拟机,Java 1.8.0_101)。 键入要计算的表达式。或者尝试:帮助。 scala>:粘贴 //进入粘贴模式(按ctrl-D键完成) 对象F{def F(a:a)=a.hidden} 案例类别F(私有[此]值隐藏:Int) //正在退出粘贴模式,现在正在解释。 :12:错误:案例类参数不允许私有[此] 案例类别F(私有[此]值隐藏:Int) ^ 为什么案例类参数不允许使用private[this]?

鉴于:

$scala
欢迎使用Scala 2.11.8(Java热点(TM)64位服务器虚拟机,Java 1.8.0_101)。
键入要计算的表达式。或者尝试:帮助。
scala>:粘贴
//进入粘贴模式(按ctrl-D键完成)
对象F{def F(a:a)=a.hidden}
案例类别F(私有[此]值隐藏:Int)
//正在退出粘贴模式,现在正在解释。
:12:错误:案例类参数不允许私有[此]
案例类别F(私有[此]值隐藏:Int)
^

为什么案例类参数不允许使用
private[this]

允许
private[this]
可能会破坏
F
上的模式匹配,因为
F.unapply
将无法访问进行适当比较所需的值。编译器可能会找到一种处理对象私有成员的方法,因为
无论如何都会编译成静态,但这会使事情变得非常复杂

讨论在case类中使用
private[this]
时出现的一个bug,它只是在没有太多公开讨论的情况下从语言中删除的。修复行为似乎太复杂了,无法涵盖用例,而不应该是用例类的用例


下面是导致编译器错误的原因。

可能是因为案例类正在模拟函数“记录”,这些记录包含所有“公共字段”。这只是把问题往后推了推,但一个更好的问题是“为什么功能记录只有公共成员?”。Carcigenicate,但在case类中可以有普通的私有字段,只有私有[这]似乎不起作用。我怀疑这与为case类生成的伴生对象需要访问其所有字段有关,例如用于模式匹配。
case类C(private val C:Int)
在模式匹配中使用accessor
C$1
,而不是
C.unapply
。它可以对
private[this]
执行相同的操作。也许会有别的东西坏掉。
$scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_101).
Type in expressions for evaluation. Or try :help.

scala> :paste
// Entering paste mode (ctrl-D to finish)

object F { def f(a: A) = a.hidden }
case class F(private [this] val hidden: Int)

// Exiting paste mode, now interpreting.

<console>:12: error: private[this] not allowed for case class parameters
       case class F(private [this] val hidden: Int)
                                       ^