什么是Scala 2.8中的嵌套/未嵌套包?

ret*_*nym 22 scala package scala-2.8

在Scala 2.7中,我可以写:

package com.acme.bar

class Bar
Run Code Online (Sandbox Code Playgroud)

.

package com.acme.foo

class Foo {
  new bar.Bar
}
Run Code Online (Sandbox Code Playgroud)

这不能在Scala 2.8中编译 - 但是这样做:

package com.acme 
package bar

class Bar
Run Code Online (Sandbox Code Playgroud)

.

package com.acme
package foo

class Foo {
  new bar.Bar
}
Run Code Online (Sandbox Code Playgroud)
  1. 这是什么动机?
  2. 在范围和可见度方面,准确的含义是什么?
  3. 我何时应该使用一种形式而不是另一种形式?

Mar*_*sky 18

关于这一点,在邮件列表上进行了几次长时间的讨论.请参阅此主题以获取问题以及该解决方案的此主题.

至于意义,只有

package A
package B
Run Code Online (Sandbox Code Playgroud)

表单将打开一个范围A,使成员A可见而无需前缀.如果您的项目包含多个相互引用的子包,则通常使用此表单.另一方面,你使用表格

package A.B.C
Run Code Online (Sandbox Code Playgroud)

如果要集成C到包层次结构中,并且不打算访问其他成员AB直接访问.一个典型的案例是

package net.myorg.myproject
Run Code Online (Sandbox Code Playgroud)

在这里,你不希望容易受到这种可能性的影响,而不是其他人定义了一个会影响根级别java的net.java包.在Scala 2.7中,您可以通过使用_root_导入来防止这种情况.但这很难看,为了安全起见,你几乎无处不在.所以目前的解决方案要好得多,IMO.


ret*_*nym 13

谢谢你到目前为止的答案!让我补充两点,我们完成了!

能见度

嵌套和未嵌套包之间的区别仅适用于作用域.可见性始终基于嵌套包.

package A

private[A] trait Secret
Run Code Online (Sandbox Code Playgroud)

这有效:

package A
package B

trait AB extends Secret
Run Code Online (Sandbox Code Playgroud)

这样做:

package A.B

trait AB extends A.Secret
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,结构都被解释为:

package A {
  trait Secret
  package B {
     //...
  }
}
Run Code Online (Sandbox Code Playgroud)

作用域

将此与范围进行比较,您可以想象对未连接的包进行此解释:

package A {
  private [A] trait Secret
}

package `A.B` {
   trait AB extends A.Secret

}
Run Code Online (Sandbox Code Playgroud)

连连看

您可以随意混合和匹配嵌套和未嵌套的包:

package com.acme.project
package util.shazam
package blerg
Run Code Online (Sandbox Code Playgroud)


oxb*_*kes 9

它不能让你更好地控制进口的东西吗?例如,如果有包:

package com.acme.foo.client
package com.acme.client
Run Code Online (Sandbox Code Playgroud)

然后从内部来看Foo,有没有令人讨厌的模糊性client被引用?例如,如果要从内部执行通配符导入Foo:

class Foo {
  import client._ //what is being imported?
}
Run Code Online (Sandbox Code Playgroud)

如果client我们有一个包,那么这可能会更成问题com.acme.java:

class Foo {
    val jul = new java.util.LinkedList //compile error; cannot find util
}
Run Code Online (Sandbox Code Playgroud)