链接包子句是在Scala 2.8中引入的,正如Martin Odersky在Scala site上所描述的那样。 我不太了解这背后的直觉。
以下是Scala书中嵌套包的示例:
package bobsrockets {
package navigation {
// In package bobsrockets.navigation
class Navigator
package tests {
// In package bobsrockets.navigation.tests
class NavigatorSuite
}
}
}
嵌套包的这种用例很有意义,因为我们可以在同一个文件中使用多个嵌套包,但是新语法实现了与之前相同的功能但没有括号。在简洁的Scala代码之间分离出包不是很难吗?
package bobsrockets
package navigation
// In package bobsrockets.navigation
class Navigator
package tests
// In package bobsrockets.navigation.tests
class NavigatorSuite
如果我弄错了,或者我误解了这个概念,请告诉我。
答案 0 :(得分:17)
你可以使用不带括号的语法,就像你的例子所示,但我从来没有在“现实生活中”看过这个。我认为新功能几乎总是用于获取范围内的父包:
package bobrockets.navigation
package tests
//now the content of bobrockets.navigation is in scope
这与写作基本相同
package bobrockets.navigation.test
import bobrockets.navigation._
然而,第一个版本遵循DRY原则。例如。如果将包bobrockets重命名为robertsrockets,则可能忘记更改第二个版本中的导入(可能指向某些“旧”代码),这在第一个版本中是不可能的。从某种意义上说,这(以及可能有像private[bobsrockets.navigation]
这样的修饰符)允许使用非常轻量级的语法将包组用作“模块”或“超级包”。
这是我所知道的主要用法,但Scala经常会出现令人惊讶的协同效应,并且模糊了线条(例如对象,包和包对象之间,val和对象之间,defs和函数之间等)方法。因此,未来将展示此功能是否具有其他有用的应用程序。
[更新] 以下是Martin Odersky本人关于此主题的新文章:http://www.artima.com/scalazine/articles/chained_package_clauses_in_scala.html