【问题标题】: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,那么有scopeAthis 也就不足为奇了。

标签: scala access-modifiers


【解决方案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 所以MyClassA 泄漏。我猜,对于PrivateClass2 的类,它的“类型”是typeSignature,即extends PrivateClass1
  • @MaatDeamon typeOf[PrivateClass2].typeSymbol.typeSignaturePrivateClass1 ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 2016-08-19
  • 2010-11-06
  • 2011-04-12
  • 2020-04-25
  • 1970-01-01
相关资源
最近更新 更多