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

时间:2010-09-07 16:53:50

标签: scala nested packages scala-2.8 chained

链接包子句是在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

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

1 个答案:

答案 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