我遇到過這些關鍵字::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