Каков мотив предложений Chained Package в Scala?

Предложение Chained package было введено в Scala 2.8, как описано Мартином Одерским на сайте Scala . Я не совсем понимаю эту интуицию.

Ниже приведен пример в книге 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

Синтаксис можно использовать без скобок, как показывает ваш пример, но я никогда не видел этого в "реальной жизни". Я думаю, что почти всегда новая функция просто используется для получения родительских пакетов в области видимости:

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 показывает часто неожиданные синергетические эффекты и размывает линии (например, между объектами, пакетами и объектами пакета, между vals и объектами, между defs и функциями и т.д.). интересными способами. Поэтому в будущем будет показано, есть ли у этой функции другие полезные приложения.

[Обновить] Вот новая статья по этому вопросу самого Мартина Одерского: http://www.artima.com/scalazine/articles/chained_package_clauses_in_scala.html p >