scala - Scala 中的好友访问

标签 scala friend

考虑

  • 函数 f 定义在包 p1

  • 一个不包含p1

    的包p2
  • p3 不包含 p2p1 也不包含在 p2 中或 p1

在 Scala 中,是否可以声明 f 可以从包 p2 访问,但不能从其他包(例如 p3)访问?

最佳答案

如果我将您的规则扩展到极限,这是可能的。虽然我不确定这是有意为之还是您忘记了规则。

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

package p1 {
  object O { private[p1] def f = println("f") }

  package p2 {
    object O { def x = p1.O.f }
  }
}

// Exiting paste mode, now interpreting.


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

package p3 {
  object O { def x = p1.O.f }
}

// Exiting paste mode, now interpreting.

<pastie>:2: error: method f in object O cannot be accessed in object p1.O
  object O { def x = p1.O.f }
                          ^
There were compilation errors!

如果 p2 也不能被 p1 包含,我认为没有办法保证 f 不能从其他地方访问。您可以使用密封的特征和隐式做一些技巧。

package p2 {
  object O { def x = p1.O.f }
}

package object p2 {
  sealed trait Friend
  private[p2] implicit val p2Friend: Friend = new Friend {}
}

package p1 {
  object O { def f(implicit friend: p2.Friend) = println("f") }
}

package p3 {
  object O { def x = p1.O.f(null) }
}

但是现在如您所见,您仍然可以在包 p3 中作弊。如果不作弊,f 无法在 p1 本身中访问,因为 p1 也没有必要的隐式。

您可以在 f 中检查 friend 是否为 null。那么p3并不能真正使用f而是只会在运行时失败,而不会在编译时失败。尽管如果有人传递 null,但如果事情在运行时爆炸,他们就不能真正提示。

关于scala - Scala 中的好友访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42354627/

相关文章:

scala - 使用绑定(bind)在类类型参数中的上下文

C++ 从友元函数(运算符 <<)访问私有(private)数组的元素

c++ - 关于使一个类成为另一个类的 friend 困境的 B/B+ 树的实现

c++ - 为什么 friend 类成员可以通过公共(public)继承类的对象访问它成为 friend 的类的私有(private)成员?

scala - Map 中的 flatMap 在 scala 中如何工作?

Scala,方法调用用点编译,没有点不编译

scalafx + intellij : NoClassDefFoundError: javafx/scene/shape/CullFace

Scala 解释器说对象不是包的成员,当它是时

c++ - 我应该在这里使用 friend 类吗?

c++ - 命名空间内的类友元函数