2017-02-06 96 views

回答

10

: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 
3

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 | 
相關問題