当 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,那么有scopeAthis 也就不足为奇了。 【参考方案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 ...

以上是关于当 this 绑定到 scala 中的包时,Private[this] 与 private[package] 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Scala 摘要

在 R 中安装与 stringr 包相关的包时出错 [重复]

如何将 Scala 中的包设为私有?

当有同名的包时,如何在 Python 3 中加载模块?

从 ASP.NET 执行 SSIS 包时出错

从 Java 可见的 Scala 中的包私有范围