Ich stieß auf diese Schlüsselwörter: :foo, ::foo, ::bar/foo, and :bar/foo
Was ist der Unterschied zwischen: foo, :: foo, :: bar/foo und: bar/foo in Clojure?
Könnten Sie Unterschiede mit Beispielen erklären?
Ich stieß auf diese Schlüsselwörter: :foo, ::foo, ::bar/foo, and :bar/foo
Was ist der Unterschied zwischen: foo, :: foo, :: bar/foo und: bar/foo in Clojure?
Könnten Sie Unterschiede mit Beispielen erklären?
:foo
ist ein nicht vollständig qualifiziertes Schlüsselwort. Es ist kein Namespace zugeordnet.
(name :foo) ; => "foo"
(namespace :foo) ; => nil
:bar/foo
ist ein Namespace-qualifizierte Schlüsselwort. Der Namensraum ist bar
, und der Name des Schlüsselwort ist foo
(name :bar/foo) ; => "foo"
(namespace :bar/foo) ; => "bar"
::foo
den aktuellen Namespace mit dem Schlüsselwort zugeordnet werden, ist es voll qualifiziert zu machen. Unter der Annahme der aktuellen Namensraum ist „user“:
*ns* ; => #namespace[user]
(name ::foo) ; => "foo"
(namespace ::foo) ; => "user"
::foo ; => :user/foo
::bar/foo
versuchen wird, alle Aliasnamen zu erweitern, um es vollständig qualifizierten zu machen:
(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 erklärt es gut.
TL; DR:
:foo
ist ein Schlüsselwort, ohne einen Namensraum, das heißt einen nicht qualifizierten Schlüsselwort.:foo/bar
ist ein qualifiziertes Schlüsselwort mit einem expliziten Namespace foo
.::foo
ist ein automatisch qualifiziertes Schlüsselwort. Wenn dieses Schlüsselwort in einem Namespace bar
auftritt, wird es zu :bar/foo
ausgewertet.::bar/foo
ist identisch mit :baz/foo
, wenn Sie den Namespace bar :as baz
benötigen.In Code:
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 |
Namensräume Stichworte sind gut an mehreren Stellen erklärt, die durch die Suche gefunden werden würde. Siehe https://clojuredocs.org/clojure.core/keyword und https://kotka.de/blog/2010/05/Did_you_know_III.html – tar