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)
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到包层次结构中,并且不打算访问其他成员A或B直接访问.一个典型的案例是
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)
它不能让你更好地控制进口的东西吗?例如,如果有包:
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)