Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的好友访问_Scala_Friend - Fatal编程技术网

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) }
}