什么是::用于clojure?

car*_*ier 78 clojure

我理解Clojure中的关键字是:关键字.但是::用于什么?为什么看起来它有绑定?

user=> :foo
:foo
user=> ::foo
:user/foo
Run Code Online (Sandbox Code Playgroud)

sku*_*uro 78

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

  • 一个示例可以是[ring](https://github.com/ring-clojure/ring)中间件(类似于Servlet过滤器),您可以使用它来丰富描述HTTP请求的映射。使用命名空间键,您可以编写自定义中间件来添加额外的值,而不必担心会与Ring app中配置的任何其他中间件产生干扰。 (2认同)

Sha*_*ron 24

正如现在为ClojureClojureScript所记录的那样,::关键字也可用于解析命名空间别名.例如,::foo/bar将评估:clojure.core/barif foo是否为别名clojure.core.如果foo未解析为命名空间,则抛出Reader异常.