किसी के बीच अंतर की व्याख्या कर सकते use
हैं और require
, दोनों जब सीधे और इस्तेमाल के रूप में :use
और :require
में ns
मैक्रो?
किसी के बीच अंतर की व्याख्या कर सकते use
हैं और require
, दोनों जब सीधे और इस्तेमाल के रूप में :use
और :require
में ns
मैक्रो?
जवाबों:
require
भार लोड करता है (जो पहले से लोड नहीं है) use
एक ही करता है प्लस इसके साथ उनके नामस्थान को संदर्भित करता है clojure.core/refer
(ताकि आप भी उपयोग करने की संभावना प्राप्त :exclude
के साथ की तरह आदि clojure.core/refer
)। दोनों को ns
सीधे उपयोग करने के बजाय अनुशंसित किया जाता है।
बाहरी कार्यों को शामिल करना require
और करना मुहावरेदार है refer
। आप नेमस्पेस संघर्ष से बचते हैं, आप केवल उन कार्यों को शामिल करते हैं जिन्हें आप वास्तव में उपयोग करते हैं / आवश्यकता होती है, और आप प्रत्येक फ़ंक्शन के स्थान को स्पष्ट रूप से घोषित करते हैं:
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
मुझे इस फ़ंक्शन को इसके नामस्थान के साथ उपसर्ग करने की आवश्यकता नहीं है:
(wrap-reload) ; works
यदि आप उपयोग नहीं करते हैं refer
तो आपको नामस्थान के साथ उपसर्ग करने की आवश्यकता होगी:
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
यदि आप use
इसके बजाय चुनते हैं, (बहुत ज्यादा) हमेशा उपयोग करें only
:
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
अन्यथा आप सब कुछ शामिल करते हैं, जिससे यह अनावश्यक रूप से बड़े ऑपरेशन और अन्य प्रोग्रामर के लिए बहुत भ्रामक हो जाता है, जहां फ़ंक्शन रहते हैं।
इसके अलावा, मैं इस ब्लॉग को क्लॉजुर नामस्थान के बारे में अधिक जानने के लिए एक संसाधन के रूप में सुझाता हूं ।
(:use foo :only [bar])
और अंत में कोई अंतर है (:require foo :refer [bar])
? ऐसा करने के लिए दो तरीके हैं अजीब लगता है।
(:require .. :refer ..)
वही काम करने का एक नया तरीका है जो आपको प्रभावी ढंग से पदावनत करने की अनुमति देता है :use
, जिसमें कुछ कमियां हैं।
सुनिश्चित करें कि हर बार जब आप किसी फ़ंक्शन को कॉल करना चाहते हैं तो आपको नामस्थान को वर्तनी की आवश्यकता नहीं होने से इसे आसान बनाना पड़ता है, हालांकि यह नामस्थान टकराव बनाकर चीजों की गड़बड़ी भी कर सकता है। "उपयोग" और "आवश्यकता" के बीच एक अच्छा मध्य मैदान केवल एक नामस्थान से कार्यों का 'उपयोग' करना है जिसका आप वास्तव में उपयोग करते हैं।
उदाहरण के लिए:
(उपयोग '[clojure-contrib.duck-streams: केवल (लेखक पाठक)]]या इससे भी बेहतर, नामस्थान परिभाषा में फ़ाइल के शीर्ष पर निर्दिष्ट करें:
(ns com.me.project (([[clojure.contrib.test-is: only (deftest is run-testing)] का उपयोग करें))
(ns ...)
वाक्य-रचना (सहित) के लिए धन्यवाद ; मैं उस की तलाश में था लेकिन मुझे जो भी उदाहरण मिले वे सभी सादे थे (use ...)
।
(require '[namepase :refer [var-name1 var-name2]])
जैसा कि उल्लेख किया गया है कि बड़ा अंतर यह है कि (require 'foo)
आप तब लिबास के नामस्थान में नामों का उल्लेख करते हैं , जैसे: (foo/bar ...)
यदि आप करते हैं (use 'foo)
तो वे अब आपके वर्तमान नामस्थान में हैं (जो कुछ भी हो सकता है और बशर्ते कोई टकराव न हो) और आप कॉल कर सकते हैं उन्हें पसंद है (bar ...)
।