Каковы мотивы положений цепочечного пакета в Scala? - PullRequest
11 голосов
/ 07 сентября 2010

Предложение цепочки пакетов было введено в Scala 2.8, как описано Мартином Одерским на 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 Ответ

18 голосов
/ 07 сентября 2010

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

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]) позволяет использовать группы пакетов в качестве «модулей» или «суперпакетов» с очень легким синтаксисом.

Это основное использование I 'Я знаю об этом, но Scala часто демонстрирует удивительные синергетические эффекты и размывает границы (например, между объектами, пакетами и объектами пакетов, между vals и объектами, между def и функциями и т. д.) интересными способами.Так что будущее покажет, есть ли у этой функции другие полезные приложения.

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

...