11

正如 Martin Odersky 在 Scala网站上所描述的,在 Scala 2.8 中引入了链式包子句。我不太明白这背后的直觉。

以下是 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

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

4

1 回答 1

18

可以按照示例显示的方式使用不带括号的语法,但我在“现实生活”中从未见过。我认为几乎总是新功能只是用于获取父包的范围:

package bobrockets.navigation
package tests

//now the content of bobrockets.navigation is in scope

这和写的基本一样

package bobrockets.navigation.test
import bobrockets.navigation._

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

这是我知道的主要用法,但 Scala 经常显示出令人惊讶的协同效应,并且以有趣的方式模糊了界限(例如,对象、包和包对象之间、val 和对象之间、defs 和函数之间等)。所以未来会展示这个功能是否还有其他有用的应用。

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

于 2010-09-07T17:16:12.747 回答