ব্যবহার এবং প্রয়োজনীয়তার মধ্যে পার্থক্য


155

যে কেউ এর মধ্যে পার্থক্য ব্যাখ্যা করতে পারবেন useএবং requireউভয় যখন সরাসরি এবং ব্যবহৃত হিসাবে :useএবং :requireমধ্যে nsম্যাক্রো?


2
এনএস ম্যাক্রো সম্পর্কিত স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি ১০০৩৮৮১৪৯/২ দেখুন ; Clojure 1.4 এ এটি আপনার ব্যবহারের পরামর্শ দেওয়া হয়েছে: পছন্দ হিসাবে প্রয়োজনীয়: ব্যবহার
কর্নি

উত্তর:


101

requireবোঝা libs (যা ইতিমধ্যে লোড হয় না), useএকই প্লাস এটি তাদের নাম স্পেস দিয়ে বোঝায় clojure.core/refer(যাতে আপনি এর :excludeমত ইত্যাদি ব্যবহারের সম্ভাবনা পান clojure.core/refer)। উভয় nsসরাসরি না বরং ব্যবহারের জন্য সুপারিশ করা হয়।


3
আমার যদি লাইব ফু দরকার হয়, তাহলে ফু-তে বার ব্যবহার করার জন্য, আমাকে প্রতিবার foo / বার লিখতে হবে, তাই না? আপনি কেন এনএস মধ্যে একটি lib লোড করতে চান কিন্তু তারপর এনএস মধ্যে এটি উল্লেখ না? আমার ধারণা আপনি সংঘর্ষ নিয়ে চিন্তিত হতে পারেন, এবং আপনি তাদের সাথে পুনর্মিলন করতে বিরক্ত করতে চান না, তাই না?
জেগশেমেস্ক

12
সংঘর্ষের সাথে পুনর্মিলন না করা একটি ভাল বিষয় এবং আরও সাধারণভাবে একটি প্রোগ্রামিং শৈলী রয়েছে যা বলে যে "নেমস্পেসগুলি একটি সম্মানজনক দুর্দান্ত ধারণা, তাদের মধ্যে আমাদের আরও কিছু হওয়া উচিত" ("পাইথনের জেন" থেকে) - সুতরাং যেমন স্টাইলটি সুপারিশ করে "নেমস্পেস ফু ব্যবহার করে" ব্যবহার করছেন না; সি ++ এ, যাতে কোডের পাঠক এবং রক্ষণাবেক্ষণকারীদের "এই বারটি কোথা থেকে আসে" তবে চিন্তার দরকার নেই তবে এর পরিবর্তে আরও স্পষ্ট foo :: বার দেখুন। প্রয়োজনীয় (বনাম ব্যবহার) এই "সুস্পষ্ট নেমস্পেস" শৈলীর সমর্থন করে।
অ্যালেক্স মার্টেলি

2
অ্যালেক্স একটি ভাল তবে পুরানো উত্তর দেয়। @ ওভারথিংক নীচে উল্লেখ করেছেন যেহেতু এই উত্তরটি দেওয়ার পরে অজ্ঞাবদ্ধ ক্লোজারটি অতিরিক্ত ব্যবহারের প্রয়োজন হয়। দেখুন: 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])? এটি করার দুটি উপায় আছে বলে মনে হচ্ছে অদ্ভুত।
চিন্তা কোরো

10
দেখতে দেখতে stackoverflow.com/a/10370672/69689 আমার প্রশ্নের উত্তর দেয়। সংক্ষেপে: (:require .. :refer ..)একই জিনিসটি করার একটি নতুন উপায় :useযা আপনাকে কার্যকরভাবে অবমূল্যায়ন করতে দেয় , যার কিছু ত্রুটি রয়েছে।
চিন্তা কোরো

উদাহরণ দেওয়া ভাল। আমি উদাহরণগুলি ভালবাসি, এটি অনেক অর্থবোধ করেছে।
এস্ট্রিড

35

ব্যবহারের বিষয়টি নিশ্চিত করুন যে আপনি যখনই কোনও ফাংশন কল করতে চান প্রতিবার নেমস্পেসের বানান না করেই এটি আরও সহজ করে তোলে যদিও এটি নেমস্পেস বিবাদ তৈরি করে জিনিসগুলিতে গোলমালও করতে পারে। "ব্যবহার" এবং "আবশ্যক" এর মধ্যে একটি ভাল মাঝারি স্থলটি হ'ল আপনি প্রকৃতপক্ষে ব্যবহার করেন এমন একটি নেমস্পেস থেকে ফাংশনগুলি 'ব্যবহার' করা।

এই ক্ষেত্রে:

 (ব্যবহার করুন '[ক্লোজার-অবদান.অডাক্ট-স্ট্রিমস: কেবল (লেখক পাঠক)])
বা আরও ভাল, নামের স্থান সংজ্ঞাতে ফাইলের শীর্ষে এটি নির্দিষ্ট করুন:

(এনএস কম.মে.প্রজেক্ট)
   (: ব্যবহার করুন [Clojure.contrib.test-is: কেবল (ডিফিট রান রান-টেস্ট)]))

3
(ns ...)সিনট্যাক্স (শ্লেষ) অন্তর্ভুক্ত করার জন্য ধন্যবাদ ; আমি এটি খুঁজছিলাম কিন্তু আমি যে উদাহরণগুলি পেয়েছি সেগুলি সরল ছিল (use ...)
পল

1
আপডেট: এই পদ্ধতিটি এখন পক্ষে হয়ে গেছে(require '[namepase :refer [var-name1 var-name2]])
আর্থার উলফেল্ট

@ আর্থার আলফেল্ট এই বিষয়টিকে অন্তর্ভুক্ত করার জন্য আপনি নিজের উত্তর আপডেট করতে চান (পাং)।
bfontaine

20

হিসাবে উল্লেখ করা হয়েছে যে বড় পার্থক্যটি হ'ল (require 'foo), এরপরে আপনি lib এর নেমস্পেসের নামগুলি উল্লেখ করেন: (foo/bar ...)আপনি যদি তা করেন (use 'foo)তবে সেগুলি এখন আপনার বর্তমান নামস্থানে রয়েছে (যে কোনও কারণেই বিবাদ নেই) এবং আপনি কল করতে পারেন তাদের পছন্দ (bar ...)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.