11

連鎖パッケージ句は、ScalaサイトのMartin Oderskyによって説明されているように、Scala2.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 に変更すると、最初のバージョンでは不可能な、2 番目のバージョン (「古い」コードを指す可能性がある) でインポートを変更するのを忘れる可能性があります。ある意味では、これにより ( のような修飾子を持つ可能性とともにprivate[bobsrockets.navigation])、非常に軽量な構文でパッケージ グループを「モジュール」または「スーパーパッケージ」として使用できます。

これは私が認識している主な使用法ですが、Scala はしばしば驚くべき相乗効果を示し、興味深い方法で (オブジェクト、パッケージとパッケージ オブジェクトの間、val とオブジェクトの間、def と関数の間など) の境界線を曖昧にしています。したがって、この機能に他の有用なアプリケーションがあるかどうかは、今後明らかになるでしょう。

[更新]これは、Martin Odersky 自身によるこのトピックに関する新しい記事です: http://www.artima.com/scalazine/articles/chained_pa ​​ckage_clauses_in_scala.html

于 2010-09-07T17:16:12.747 に答える