Clojure中的::是什么意思?


83

我了解Clojure中的关键字:keyword。但是有什么::用呢?为什么看起来像具有约束力?

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

Answers:


83

双冒号可以使您的当前名称空间完全限定关键字。这是为了避免对不同库有意义的关键字名称冲突。如果没有完全限定的关键字,则可能会意外覆盖映射中的某些值,并破坏与库的兼容性。


至于提供的理由,不是很确定为什么首先要修改图书馆应该为他们处理的地图。如果这确实是主要动机,那么进行一些阐明可能会有所帮助。
matanster

3
一个示例可能是环形中间件(类似于Servlet过滤器),您可以使用它来丰富描述HTTP请求的映射。使用命名空间键,您可以编写自定义中间件来添加额外的值,而不必担心会与Ring app中配置的任何其他中间件发生冲突。
斯库罗

27

正如现在为ClojureClojureScript所记录的那样::关键字也可以用于解析名称空间别名。例如,::foo/bar将计算:clojure.core/bariffoo是的别名clojure.core。如果foo无法解析为名称空间,则会引发Reader异常。



同样重要,因为Clojure的1.9,是#:#::语法,这与地图一起使用,以解决关键字里面的地图,如解释在这里
Joe Corneli
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.