Для чего :: используется в закрытии?


83

Я понимаю, что в Clojure есть ключевые слова :keyword. Но для чего это ::используется? Почему это похоже на привязку?

user=> :foo
:foo
user=> ::foo
:user/foo

Ответы:


83

Двойное двоеточие используется для полной квалификации ключевых слов с вашим текущим пространством имен. Это сделано для того, чтобы избежать конфликтов имен ключевых слов, имеющих значение для разных библиотек. Без полностью определенных ключевых слов вы можете случайно перезаписать некоторые значения на карте и нарушить совместимость с библиотекой.


Что касается предоставленного обоснования, не совсем уверен, зачем вообще нужно переделывать карту, которую должна обрабатывать библиотека. Если это действительно основная мотивация, некоторые пояснения могут помочь.
Matanster

3
одним из примеров может быть промежуточное программное обеспечение для кольца (аналогично фильтрам сервлетов), с помощью которого вы можете дополнить карту, описывающую HTTP-запрос. Ключи с именованными пространствами позволяют вам написать собственное промежуточное ПО для добавления дополнительных значений, не беспокоясь о взаимодействии с любым другим промежуточным ПО, настроенным в вашем кольцевом приложении.
skuro

27

Как теперь описано для Clojure, а также для ClojureScript , ::ключевые слова также могут использоваться для разрешения псевдонимов пространств имен. Например, ::foo/barбудет оцениваться, :clojure.core/barесли fooэто псевдоним clojure.core. Исключение чтения выдается, если fooне разрешается в пространство имен.


Эта функция задокументирована там - clojure.org/reference/reader#_literals - cljs.github.io/api/syntax/keyword-qualify
maxp

Также, начиная с Clojure 1.9, актуален #:и #::синтаксис, который используется вместе с картой для разрешения ключевых слов внутри карты, как описано здесь .
Джо Корнели
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.