当 this 绑定到 scala 中的包时,Private[this] 与 private[package] 有啥区别?
Posted
技术标签:
【中文标题】当 this 绑定到 scala 中的包时,Private[this] 与 private[package] 有啥区别?【英文标题】:What is the difference between Private[this] vs private[package] when this bind to the package in scala?当 this 绑定到 scala 中的包时,Private[this] 与 private[package] 有什么区别? 【发布时间】:2021-02-21 22:32:27 【问题描述】:当 this Bind to a package vs Private[PackageName] 时,我很难理解 Private[this]
例如
这很好用:
package scopeA
private[scopeA] class PrivateClass1
class PrivateClass2 extends PrivateClass1
但这不是
package scopeA
private[this] class PrivateClass1
class PrivateClass2 extends PrivateClass1 //private class PrivateClass1 escapes its defining scope as part of type scopeA.PrivateClass1
但是,如果我这样修改第二个:
package scopeA
private[this] class PrivateClass1
private class PrivateClass2 extends PrivateClass1
private[this]
或private
,在最后一个场景中效果相同。
我可以看出区别,但我无法准确地说出它。因此我的问题是,当这个绑定到一个包时,Private[this]
的含义是什么?和private[PackageName]
有什么不同,两者的具体区别是什么?
有一些关于转义我不确定要遵循的范围的东西,为什么使用包名可以但不是这个?
【问题讨论】:
我很惊讶private[this]
起作用了。
@LuisMiguelMejíaSuárez 既然有scopeA.type
,那么有scopeA
的this
也就不足为奇了。
【参考方案1】:
this
指的是(可能的)包对象
package com
package object example
implicitly[this.type =:= com.example.`package`.type]
According to the Scala Language Specification, packages are AnyRef values and have types. How does this make sense?
【讨论】:
很棒的收获。虽然它仍然没有完全回答这个问题......还是这样? @MaatDeamon 我猜对于普通对象(不是包对象或包)的行为是相同的。什么让你感到惊讶? 好吧,在我的问题中,我根本没有使用包对象。所以除非有一个隐式的包对象就可以了。但是,这里的明确规则是什么?为什么Private[this]
的行为与 private[PackageName]
不同,我不明白。最终,如果我不明白也没关系,但我只是对此感到好奇。
@MaatDeamon 让我们考虑一个使用val
而不是类的示例:object A private class MyClass; val mc = new MyClass
。现在MyClass
脱离了作用域,因为外面的每个人都可以问A.mc
的类型是什么。答案是A.MyClass
所以MyClass
从A
泄漏。我猜,对于PrivateClass2
的类,它的“类型”是typeSignature
,即extends PrivateClass1
。
@MaatDeamon typeOf[PrivateClass2].typeSymbol.typeSignature
是 PrivateClass1 ...
以上是关于当 this 绑定到 scala 中的包时,Private[this] 与 private[package] 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章