Scala中的好友访问
考虑Scala中的好友访问,scala,friend,Scala,Friend,考虑 在包p1 不包含p1 不包含p2或p1的包p3,也不包含在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") }
- 在包
p1
- 不包含
p1
- 不包含
或p2
的包p1
,也不包含在p3
或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!
但是现在你可以看到你仍然可以在包p3
中作弊。如果没有欺骗,f
不能在p1
本身中访问,因为p1
也没有必要的隐式属性
您可以在
f
中检查friend
是否为null
。然后,p3
不能真正使用f
,但它只会在运行时失败,而不会在编译时失败。尽管有人在传递null
时,如果运行时出现问题,他们也不会抱怨。现在我想,使用包对象和隐式可能是一种方法,将一些隐式导入包对象(位于p2
)中,并在调用f
时要求它存在(在f
中要求将其作为参数).Nice!谢谢。null参数很有趣,这让我想知道:在将null传递给参数时,是否没有注释会导致编译器错误?您可以尝试使用AnyVal
,因为只有AnyRef
可以为null。但我认为仍然可以null.asInstanceOf[p2.Friend]
。
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) }
}