私はそれらのキーワードに遭遇しました::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 :as baz
が必要な場合::bar/foo
の名前空間が:baz/foo
と同じです。コードで:
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