我遇到过这些关键字::foo, ::foo, ::bar/foo, and :bar/foo
Clojure中foo,:: foo,:: bar/foo和bar/foo之间的区别是什么?
你能解释一下这个例子吗?
我遇到过这些关键字::foo, ::foo, ::bar/foo, and :bar/foo
Clojure中foo,:: foo,:: bar/foo和bar/foo之间的区别是什么?
你能解释一下这个例子吗?
:foo
是一种非完全限定关键字。它没有与它关联的名称空间。
(name :foo) ; => "foo"
(namespace :foo) ; => nil
:bar/foo
是限定名称空间的关键字。该命名空间为bar
,和关键字的名称是foo
(name :bar/foo) ; => "foo"
(namespace :bar/foo) ; => "bar"
::foo
将当前命名空间与关键字相关联,使得它完全合格。假设当前的命名空间是“用户”:
*ns* ; => #namespace[user]
(name ::foo) ; => "foo"
(namespace ::foo) ; => "user"
::foo ; => :user/foo
::bar/foo
将尝试扩展任何别名,使其完全合格:
(create-ns 'my.namespace) ; => #namespace[my.namespace]
(alias 'bar 'my.namespace) ; => nil
(name ::bar/foo) ; => "foo"
(namespace ::bar/foo) ; => "my.namespace"
::bar/foo ; => :my.namespace/foo
This article解释得很好。
TL; DR:
:foo
是不带名称空间中的关键字,即不合格关键字。:foo/bar
是带有明确的命名空间foo
一个合格的关键字。::foo
是一个自动限定的关键字。如果此关键字出现在名称空间bar
内,则其评估为:bar/foo
。::bar/foo
的命名空间是一样的:baz/foo
如果您需要的命名空间bar :as baz
。在代码:
boot.user=> (ns foo)
nil
foo=> (ns bar (:require [foo :as f]))
nil
bar=> (def examples [:foo ::foo ::f/foo :bar/foo])
#'bar/examples
bar=> examples
[:foo :bar/foo :foo/foo :bar/foo]
bar=> (use 'clojure.pprint)
nil
bar=> (print-table (map (fn [example]
{:key example :namespace (namespace example)
:name (name example)})
examples))
| :key | :namespace | :name |
|----------+------------+-------|
| :foo | | foo |
| :bar/foo | bar | foo |
| :foo/foo | foo | foo |
| :bar/foo | bar | foo |
命名空间关键字中,将通过搜索发现多个地方很好地解释。请参阅https://clojuredocs.org/clojure.core/keyword和https://kotka.de/blog/2010/05/Did_you_know_III.html – tar