2

最近我遇到了像{::tag 10}Clojure 这样的建筑。这是什么意思?我的实验表明它是一个关键字:

=> (type :tag)
clojure.lang.Keyword
=> (type ::tag)
clojure.lang.Keyword

区别在于价值本身:

=> :tag
:tag
=> ::tag
:/user/tag

似乎::tag是命名空间限定的。猜对了吗?如果是,命名空间限定关键字和非限定关键字有什么区别?什么时候有用?

4

1 回答 1

3

双冒号是命名空间限定关键字的简写语法,带有当前命名空间。它非常适合防止与哈希映射中基于外部关键字的键发生冲突,例如在函数元数据中具有 :name 和 ::name 键或比较参数的 :name 与 ::name 值。

就像您将命名公共函数以识别它并防止名称冲突一样,当将自定义关键字公开为键或值时,可能与现有关键字发生冲突,您应该考虑命名空间限定它。

于 2013-09-14T00:35:45.247 回答