gpt4 book ai didi

scala - Scala 中链式包子句背后的动机是什么?

转载 作者:行者123 更新时间:2023-12-04 01:50:11 25 4
gpt4 key购买 nike

正如 Martin Odersky 在 Scala site 上所描述的,在 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

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

最佳答案

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

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] 这样的修饰符)允许使用非常轻量级的语法将包组用作“模块”或“ super 包”。

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

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

关于scala - Scala 中链式包子句背后的动机是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3660806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com