Scala中Chained Package子句背后的动机是什么?

Mon*_*bal 11 scala nested packages chained scala-2.8

链接包子句在Scala 2.8中引入,正如Martin Odersky在Scala 网站上所描述的那样.我不太了解这背后的直觉.

以下是Scala书中嵌套包的示例:

package bobsrockets {
    package navigation {
        // In package bobsrockets.navigation
        class Navigator
        package tests {
            // In package bobsrockets.navigation.tests
            class NavigatorSuite
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

嵌套包的这种使用情况是有道理的,因为我们可以在同一个文件中使用多个嵌套包,但是新的语法之前达到同样的事情,但没有支架.在简洁的Scala代码之间分离出包不难吗?

package bobsrockets
package navigation
// In package bobsrockets.navigation
class Navigator
package tests
// In package bobsrockets.navigation.tests
class NavigatorSuite
Run Code Online (Sandbox Code Playgroud)

如果我弄错了,或者我误解了这个概念,请告诉我.

Lan*_*dei 18

可以在示例显示的方式中使用不带括号的语法,但我从未在"现实生活"中看到过这种情况.我认为新功能几乎总是用于获取范围内的父包:

package bobrockets.navigation
package tests

//now the content of bobrockets.navigation is in scope
Run Code Online (Sandbox Code Playgroud)

这与写作基本相同

package bobrockets.navigation.test
import bobrockets.navigation._
Run Code Online (Sandbox Code Playgroud)

但是,第一个版本遵循DRY原则.例如,如果将包bobrockets重命名为robertsrockets,则可能忘记更改第二个版本中的导入(可能指向某些"旧"代码),这在第一个版本中是不可能的.从某种意义上说,这(以及具有类似修饰符的可能性private[bobsrockets.navigation])允许将包组用作具有非常轻量级语法的"模块"或"超级包".

这是我所知道的主要用法,但Scala通常会出现令人惊讶的协同效应,并且以有趣的方式模糊线条(例如,对象,包和包对象之间,val和对象之间,defs和函数之间等).因此,未来将展示此功能是否具有其他有用的应用程序.

[更新]以下是Martin Odersky本人关于此主题的新文章:http://www.artima.com/scalazine/articles/chained_pa​​ckage_clauses_in_scala.html