2017-02-06 16 views
5

मैं उन खोजशब्दों में आया: :foo, ::foo, ::bar/foo, and :bar/fooफू, :: foo, :: bar/foo, और: क्लोजर में बार/foo के बीच क्या अंतर है?

क्या आप उदाहरणों के साथ मतभेदों को समझा सकते हैं?

+0

namespaced कीवर्ड में कई स्थानों की खोज करके पाया जा होता है कि अच्छी तरह से समझाया गया है। Https://clojuredocs.org/clojure.core/keyword और https://kotka.de/blog/2010/05/Did_you_know_III.html देखें – tar

उत्तर

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 इसे अच्छी तरह से समझाता है।

टी एल; डॉ:

  • :foo एक namespace किए बगैर खोजशब्द, यानि कि एक अयोग्य कीवर्ड है।
  • :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 | 
संबंधित मुद्दे