उपयोग और आवश्यकता के बीच अंतर


155

किसी के बीच अंतर की व्याख्या कर सकते useहैं और require, दोनों जब सीधे और इस्तेमाल के रूप में :useऔर :requireमें nsमैक्रो?


2
Ns मैक्रो के संबंध में भी stackoverflow.com/questions/10358149/… देखें ; clojure 1.4 में यह सुझाव दिया गया है कि आप इसका उपयोग करें: वरीयता के लिए आवश्यकता: उपयोग
Korny

जवाबों:


101

require भार लोड करता है (जो पहले से लोड नहीं है) use एक ही करता है प्लस इसके साथ उनके नामस्थान को संदर्भित करता है clojure.core/refer(ताकि आप भी उपयोग करने की संभावना प्राप्त :excludeके साथ की तरह आदि clojure.core/refer)। दोनों को nsसीधे उपयोग करने के बजाय अनुशंसित किया जाता है।


3
अगर मुझे lib foo की आवश्यकता है, तो foo में बार का उपयोग करने के लिए, मुझे हर बार foo / bar लिखना होगा, है ना? आप ns में एक लिबर लोड क्यों करना चाहेंगे, लेकिन फिर इसे ns में नहीं देखें? मुझे लगता है कि आप टकराव के बारे में चिंतित हो सकते हैं, और आप उन्हें ठीक करने के लिए परेशान नहीं करना चाहते हैं, है ना?
जिग्सकेमिश

12
टकरावों का सामंजस्य न होना एक अच्छा बिंदु है, और आम तौर पर एक प्रोग्रामिंग शैली है जो कहती है "नाम स्थान एक महान विचार है, हमारे पास उनमें से अधिक होना चाहिए" ("द ज़ेन ऑफ पायथन") से - इसलिए जैसे कि यह शैली है "नेमस्पेस फू का उपयोग करके;" C ++ में, ताकि कोड के पाठकों और अनुरक्षकों को "जहां यह बार कहाँ से आता है" चिंता करने की ज़रूरत नहीं होगी, लेकिन इसके बजाय अधिक स्पष्ट foo :: बार देखें। आवश्यकता (बनाम उपयोग) इस "स्पष्ट नामस्थान" शैली का समर्थन करता है।
एलेक्स मार्टेली

2
एलेक्स एक अच्छा लेकिन पुराना जवाब देता है। जैसा कि @overthink नीचे इंगित करता है, इस उत्तर के बाद मुहावरेदार क्लोजर की सिफारिश की जाती है, उपयोग की आवश्यकता होती है। देखें: dev.clojure.org/jira/browse/CLJ-879
फिल कूपर

हालांकि यह स्वीकृत और सबसे अधिक मतदान वाला उत्तर है, यह पुराना है और एक पुराने दृश्य का प्रतिनिधित्व करता है। बेहतर उत्तर यह है कि @rzv से: stackoverflow.com/a/16429572/172272
डिडिएर ए।

65

बाहरी कार्यों को शामिल करना 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])? ऐसा करने के लिए दो तरीके हैं अजीब लगता है।
overthink

10
लगता है stackoverflow.com/a/10370672/69689 मेरे सवाल का जवाब देता है। संक्षेप में: (:require .. :refer ..)वही काम करने का एक नया तरीका है जो आपको प्रभावी ढंग से पदावनत करने की अनुमति देता है :use, जिसमें कुछ कमियां हैं।
overthink

अच्छे उदाहरण दे रहे हैं। मुझे उदाहरण पसंद हैं, इससे बहुत कुछ समझ में आया।
एस्ट्रिड

35

सुनिश्चित करें कि हर बार जब आप किसी फ़ंक्शन को कॉल करना चाहते हैं तो आपको नामस्थान को वर्तनी की आवश्यकता नहीं होने से इसे आसान बनाना पड़ता है, हालांकि यह नामस्थान टकराव बनाकर चीजों की गड़बड़ी भी कर सकता है। "उपयोग" और "आवश्यकता" के बीच एक अच्छा मध्य मैदान केवल एक नामस्थान से कार्यों का 'उपयोग' करना है जिसका आप वास्तव में उपयोग करते हैं।

उदाहरण के लिए:

 (उपयोग '[clojure-contrib.duck-streams: केवल (लेखक पाठक)]]
या इससे भी बेहतर, नामस्थान परिभाषा में फ़ाइल के शीर्ष पर निर्दिष्ट करें:

(ns com.me.project
   (([[clojure.contrib.test-is: only (deftest is run-testing)] का उपयोग करें))

3
(ns ...)वाक्य-रचना (सहित) के लिए धन्यवाद ; मैं उस की तलाश में था लेकिन मुझे जो भी उदाहरण मिले वे सभी सादे थे (use ...)
पौल

1
अद्यतन: इस विधि के पक्ष में अब (require '[namepase :refer [var-name1 var-name2]])
मान लिया गया है

@ArthurUlfeldt आप इस (शामिल) को शामिल करने के लिए अपने उत्तर को अद्यतन करना चाह सकते हैं।
bfontaine

20

जैसा कि उल्लेख किया गया है कि बड़ा अंतर यह है कि (require 'foo)आप तब लिबास के नामस्थान में नामों का उल्लेख करते हैं , जैसे: (foo/bar ...)यदि आप करते हैं (use 'foo)तो वे अब आपके वर्तमान नामस्थान में हैं (जो कुछ भी हो सकता है और बशर्ते कोई टकराव न हो) और आप कॉल कर सकते हैं उन्हें पसंद है (bar ...)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.