রুবির অন্তর্ভুক্ত এবং প্রয়োজনীয়তার মধ্যে পার্থক্য কী?


465

আমার প্রশ্নটি " রুবির অন্তর্ভুক্ত এবং প্রসারিতের মধ্যে পার্থক্য কী? " এর অনুরূপ ।

মধ্যে পার্থক্য কি requireএবং includeরুবি মধ্যে? আমি যদি আমার ক্লাসের কোনও মডিউল থেকে কেবল পদ্ধতিগুলি ব্যবহার করতে চাই requireতবে আমার এটি বা includeএটি হওয়া উচিত ?


1
কি এটা এর মূল্য জন্য, এখানে জন্য সম্প্রদায়ের ডকুমেন্টেশন লিঙ্ক requireএবং include,, এবং এছাড়াও প্রাসঙ্গিক Module#append_features

উত্তর:


543

রুবিতে "অন্তর্ভুক্ত" এবং "প্রয়োজনীয়" এর মধ্যে পার্থক্য কী?

উত্তর:

অন্তর্ভুক্ত এবং প্রয়োজনীয় পদ্ধতিগুলি খুব আলাদা জিনিস করে।

প্রয়োজনীয় পদ্ধতিটি অন্যান্য বেশিরভাগ প্রোগ্রামিং ভাষায় অন্তর্ভুক্ত রয়েছে যা করে: অন্য একটি ফাইল চালান। এটি অতীতে আপনার যা প্রয়োজন তাও ট্র্যাক করে এবং একই ফাইলের জন্য দু'বার প্রয়োজন হবে না। এই যুক্ত কার্যকারিতা ব্যতীত অন্য কোনও ফাইল চালানোর জন্য, আপনি লোড পদ্ধতিটি ব্যবহার করতে পারেন।

অন্তর্ভুক্ত পদ্ধতিটি অন্য মডিউল থেকে সমস্ত পদ্ধতি গ্রহণ করে এবং সেগুলি বর্তমান মডিউলে অন্তর্ভুক্ত করে। এটি একটি ভাষা-স্তরের জিনিস যা প্রয়োজন অনুযায়ী ফাইল-স্তরের জিনিসের বিপরীতে। অন্তর্ভুক্ত পদ্ধতি হ'ল অন্যান্য মডিউলগুলির সাথে ক্লাসগুলি "প্রসারিত" করার প্রাথমিক উপায় (সাধারণত মিক্স-ইনস হিসাবে পরিচিত)। উদাহরণস্বরূপ, যদি আপনার শ্রেণিটি "প্রতিটি" পদ্ধতিটি সংজ্ঞায়িত করে তবে আপনি মিক্সিন মডিউলটিকে পরিগণিত হিসাবে অন্তর্ভুক্ত করতে পারেন এবং এটি সংগ্রহ হিসাবে কাজ করতে পারে। এটি বিভ্রান্তিকর হতে পারে কারণ অন্তর্ভুক্ত ক্রিয়াটি অন্যান্য ভাষায় খুব আলাদাভাবে ব্যবহৃত হয়।

সূত্র

সুতরাং আপনি যদি মডিউলটি প্রসারিত বা মিশ্র-ইন না করে কেবল ব্যবহার করতে চান তবে আপনি ব্যবহার করতে চান require

অদ্ভুতভাবে যথেষ্ট, রুবি requireসি এর includeসাথে সাদৃশ্যযুক্ত, যখন রুবি includeপ্রায় সি এর মতো কিছুই নয় include


45
আসলে সি এর অন্তর্ভুক্ত রয়েছে, প্রয়োজন মতো কোনও ফাইল লোড করে না, পরিবর্তে ফাইলের বিষয়বস্তু দ্বারা # অন্তর্ভুক্ত লাইনটি প্রতিস্থাপন করুন। অন্তর্ভুক্ত ফাইলগুলিকে 'শিরোনাম' হতে হবে না এবং # অন্তর্ভুক্ত ফাইলের শুরুতে হওয়া উচিত নয় তবে ক্লাসে বা কোনও পদ্ধতির সংজ্ঞার মতো কোথাও হতে পারে। এর অর্থ আপনি কোনও ফাইলের কিছু পদ্ধতি লিখে সি ++ এ মিশ্রিন করতে পারেন এবং এটি ক্লাসের কোডে অন্তর্ভুক্ত করতে পারেন, ঠিক তা আপনি রুবিতে করবেন। সুতরাং তারা খুব বেশি দূরে নয়, যদিও এটি সত্যিকার অর্থে সি এর মধ্যে একটি সাধারণ অনুশীলন নয়।
এমবি 14

13
এই উত্তর উদাহরণ সহ উপকার করতে পারে।
ট্র্যাভিস ভালুক

12
এমবি 14 এর মন্তব্য এটিকে বোঝায়, তবে এটি স্পষ্ট করে বলেছে: উত্তর যা বলেছে তার বিপরীতে কোনও ফাইল "চালানো" হয় না , বরং এটি লোড করা ফাইলের অংশ হিসাবে বোঝায় । এটি অর্থসূচক নিটপিকিংয়ের মতো মনে হলেও আসলে এটি একটি গুরুত্বপূর্ণ পার্থক্য।
লোনি এলোয়াস

দুর্দান্ত ব্যাখ্যা। সর্বশেষ বিবৃতিটি দিয়ে পয়েন্ট হোম চালনা করার জন্য ধন্যবাদ 'অদ্ভুতভাবে যথেষ্ট, রুবির প্রয়োজনীয়তা সি এর অন্তর্ভুক্তের সাথে সমান, যদিও রুবির অন্তর্ভুক্ত সি'র অন্তর্ভুক্ত প্রায় কিছুই নয়।'
আর্টস্যাবিন্টসেভ

1
@ গ্রেগস্কিট: includeরুবিতে কেবল উত্তরাধিকার। class C; include M endতোলে Mএর সুপারক্লাস Cএবং (সাবেক) এর সুপারক্লাস Cএর সুপারক্লাস Mincludeউত্তরাধিকারের মাধ্যমে সি এর কাজ করে না বলে আমি মনে করি না, এটি সহজ পাঠ্য / লেক্সিকাল প্রতিস্থাপন বলে মনে করি।
জার্গ ডব্লু মিটাগ

100

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

গো EX:

 module A
   def say
     puts "this is module A"
   end
 end

 class B
   include A
 end

 class C
   extend A
 end

B.say => অপরিজ্ঞাত পদ্ধতি বি: শ্রেণীর জন্য 'বলুন'

B.new.say => এটি মডিউল এ

C.say => এটি মডিউল এ

C.new.say => সি: শ্রেণির জন্য অপরিজ্ঞাত পদ্ধতি 'বলুন'


23
আমি মনে করি এটি প্রশ্নের উত্তর দেয় না, তবে এটিই আমি যা খুঁজছিলাম =)
সিরো সান্তিলি i 冠状 病 六四 事件 法轮功

2
এটি আসলে কি মধ্যে পার্থক্য প্রশ্নের উত্তর নেই requireএবং includeআছে।

94

মেটাপোগ্র্যামিং রুবি বই থেকে,

require()পদ্ধতি বেশ অনুরূপ load(), কিন্তু এটা একটি ভিন্ন উদ্দেশ্যে বোঝানো হচ্ছে। আপনি load()কোডটি কার্যকর করতে ব্যবহার করেন এবং আপনি require()লাইব্রেরি আমদানি করতে ব্যবহার করেন।


73
আপনার উত্তরে অন্য ভাষার সাথে তুলনা না করার জন্য আপভোট করুন :)
স্টিভো

প্রশ্নের প্রসঙ্গে একটি উত্তর না দেওয়ার জন্য ডাউন ভোট: "আমি যদি কেবল আমার ক্লাসের মডিউল থেকে পদ্ধতিগুলি ব্যবহার করতে চাই?"
বেনক

57
  • রুবি requireঅন্যান্য ভাষায় "অন্তর্ভুক্ত" এর মতো (যেমন সি)। এটি রুবিকে বলে যে আপনি অন্য কোনও ফাইলের বিষয়বস্তু আনতে চান । অন্যান্য ভাষায় অনুরূপ প্রক্রিয়াগুলি হ'ল:

  • রুবি মিক্সিনগুলির জন্য ব্যবহৃতinclude একটি অবজেক্ট-ভিত্তিক উত্তরাধিকার প্রক্রিয়া

এখানে একটি ভাল ব্যাখ্যা আছে :

[সহজ] সহজ উত্তরটি হ'ল প্রয়োজনীয় এবং অন্তর্ভুক্তটি মূলত সম্পর্কিত নয়।

"আবশ্যক" সি অন্তর্ভুক্ত অনুরূপ, যা নবাগত বিভ্রান্তির কারণ হতে পারে। (একটি উল্লেখযোগ্য পার্থক্য হ'ল প্রয়োজনীয়তা সম্পন্ন হলে প্রয়োজনীয় ফাইলের "স্থানীয় বাষ্পীভবন" এর স্থানীয় লোকেরা।)

রুবি অন্তর্ভুক্ত সি এর মতো কিছুই নয় nothing স্টেটমেন্টটি ক্লাসে একটি মডিউল "মিক্স করে" অন্তর্ভুক্ত করে। এটি একাধিক উত্তরাধিকারের একটি সীমিত রূপ । একটি অন্তর্ভুক্ত মডিউল আক্ষরিকভাবে এটি অন্তর্ভুক্ত জিনিসটির উপর "ইস-এ" সম্পর্ক প্রদান করে।

সামনে জোর দাও.


7

আপনি কি কখনও requireএকটি মডিউল চেষ্টা করেছেন ? ফলাফল কি ছিল? ঠিক করার চেষ্টা করুন:

MyModule = Module.new
require MyModule # see what happens

মডিউলগুলির প্রয়োজন হতে পারে না, কেবল অন্তর্ভুক্ত!


এখানে দৃser়তা সঠিক নয়। মডিউল প্রয়োজন হতে পারে। এবং উপরের কোডটি যে কেউ চালাচ্ছেন তারা TypeErrorশব্দটি Moduleপরিবর্তিত হলে তারা একই ফলাফল ( ) পেয়ে যাবেন Class
pjd

7

প্রোগ্রামিং রুবি থেকে 1.9

আমরা যুক্ত হওয়ার আগে আমরা বিবৃতিটি নিয়ে বেশ কয়েকটি পয়েন্ট করব before প্রথমত, ফাইলগুলির সাথে এর কোনও সম্পর্ক নেই। সি প্রোগ্রামাররা সংকলনের সময় একটি ফাইলের বিষয়বস্তু অন্যটিতে sertোকাতে # অন্তর্ভুক্ত নামক একটি প্রিপ্রসেসর নির্দেশিকা ব্যবহার করে। রুবি অন্তর্ভুক্ত স্টেটমেন্টটি কেবল একটি মডিউলটির জন্য একটি রেফারেন্স দেয়। যদি সেই মডিউলটি পৃথক ফাইলে থাকে তবে আপনাকে অবশ্যই অন্তর্ভুক্ত ব্যবহারের আগে সেই ফাইলটি টেনে আনার জন্য প্রয়োজনীয় (বা এটির কম ব্যবহৃত চাচাতো ভাই, লোড) ব্যবহার করতে হবে। দ্বিতীয়ত, একটি রুবি অন্তর্ভুক্ত মডিউলটির উদাহরণ পদ্ধতিগুলি ক্লাসে অনুলিপি করে না। পরিবর্তে, এটি ক্লাস থেকে অন্তর্ভুক্ত মডিউলটিতে একটি রেফারেন্স তৈরি করে। যদি একাধিক ক্লাসে সেই মডিউলটি অন্তর্ভুক্ত থাকে তবে তারা সকলে একই জিনিসটির দিকে নির্দেশ করবে। আপনি যদি কোনও প্রোগ্রামের চলমান অবস্থায় মডিউলটির মধ্যে কোনও পদ্ধতির সংজ্ঞা পরিবর্তন করেন,


3

অন্তর্ভুক্ত করুন যখন আপনি নীচের চিত্র অনুসারে আপনার ক্লাসে কোনও মডিউল অন্তর্ভুক্ত করবেন তখন মনে হয় আপনি মডিউলটির মধ্যে সংজ্ঞায়িত কোডটি নিয়েছেন এবং শ্রেণীর মধ্যে সন্নিবেশ করিয়েছেন, যেখানে আপনি এটি 'অন্তর্ভুক্ত' করেছেন। এটি 'মিক্সিন' আচরণের অনুমতি দেয়। এটি আপনার কোডটি অনুলিপি এড়ানোর জন্য ব্যবহার করে, উদাহরণস্বরূপ, যদি একাধিক ক্লাস থাকে তবে মডিউলে একই কোডের প্রয়োজন হত।

লোড লোড পদ্ধতিটি প্রায় প্রয়োজনীয় পদ্ধতির মতো এটি বাদ দিয়ে এটি যে লাইব্রেরিটি লোড হয়েছে কিনা তা ট্র্যাক করে না। সুতরাং একাধিকবার একটি লাইব্রেরি লোড করা সম্ভব এবং লোড পদ্ধতিটি ব্যবহার করার সময় আপনাকে অবশ্যই লাইব্রেরির ফাইলের নামের ".rb" এক্সটেনশনটি নির্দিষ্ট করতে হবে।

প্রয়োজনীয় প্রয়োজনীয় পদ্ধতিটি আপনাকে একটি লাইব্রেরি লোড করতে দেয় এবং এটি একবারের বেশি লোড হওয়া থেকে বাধা দেয়। আপনি প্রথমবারের পরে একই লাইব্রেরিটি লোড করার চেষ্টা করলে প্রয়োজনীয় পদ্ধতিটি 'মিথ্যা' ফিরে আসবে। প্রয়োজনীয় পদ্ধতিটি কেবল তখনই ব্যবহার করা প্রয়োজন যদি আপনি লোড করা লাইব্রেরি একটি পৃথক ফাইলে সংজ্ঞায়িত করা হয়, যা সাধারণত ক্ষেত্রে হয়।

আপনি এটিকে http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-incolve-vs-extend/ পছন্দ করতে পারেন


3

নীচে প্রয়োজনীয় এবং অন্তর্ভুক্তের মধ্যে কয়েকটি বুনিয়াদি পার্থক্য রয়েছে:

প্রয়োজন:

  1. প্রয়োজনীয় ফাইল সিস্টেমটি থেকে ফাইলটি পড়ে, পার্স করে, মেমোরিতে সংরক্ষণ করে এবং নির্দিষ্ট স্থানে চালায় যার অর্থ স্ক্রিপ্ট চলাকালীন স্ক্রিপ্ট চলাকালীন আপনি যদি কিছু পরিবর্তনও করেন তবে পরিবর্তনটি প্রতিফলিত হবে না।
  2. আমাদের নাম দিয়ে ফাইল দরকার, মডিউল নাম দিয়ে নয়।
  3. এটি সাধারণত গ্রন্থাগার এবং এক্সটেনশনের জন্য ব্যবহৃত হয়।

অন্তর্ভুক্ত করুন:

  1. আপনি যখন আপনার ক্লাসে কোনও মডিউল অন্তর্ভুক্ত করবেন তখন এটি এমন আচরণ করে যে আপনি নিজের মডিউলে সংজ্ঞায়িত কোডটি গ্রহণ করেছেন এবং এটি আপনার শ্রেণিতে সন্নিবেশ করেছেন।
  2. আমরা ফাইলের নাম নয়, মডিউল নাম অন্তর্ভুক্ত।
  3. এটি সাধারণত কোড শুকানোর জন্য এবং কোডটিতে নকলটি সরাতে ব্যবহৃত হয়।

2
require(name)

এটি বোলেয়ান সত্য / মিথ্যা প্রত্যাবর্তন করবে

যে নামটি প্রয়োজনীয়তার সাথে প্যারামিটার হিসাবে পাস করা হয়েছে, রুবি আপনার লোডের পথে সেই নামটি দিয়ে উত্স ফাইলটি অনুসন্ধান করার চেষ্টা করবে। আপনি প্রথমবারের পরে একই লাইব্রেরিটি লোড করার চেষ্টা করলে প্রয়োজনীয় পদ্ধতিটি 'মিথ্যা' ফিরে আসবে। প্রয়োজনীয় পদ্ধতিটি কেবল তখনই ব্যবহার করা প্রয়োজন যদি আপনি লোড করা লাইব্রেরিটি একটি পৃথক ফাইলে সংজ্ঞায়িত করা হয়। সুতরাং এটি লাইব্রেরিটি ইতিমধ্যে লোড হয়েছিল কিনা তা ট্র্যাক করে রাখে।

include module_name

ধরুন আপনার যদি এমন কিছু পদ্ধতি থাকে যা আপনার দুটি পৃথক শ্রেণিতে থাকা দরকার। তাহলে আপনাকে এগুলি দুটি ক্লাসে লিখতে হবে না। পরিবর্তে আপনি যা করতে পারেন তা হল মডিউলে এটি সংজ্ঞায়িত করুন। এবং তারপরে এই ক্লাসটিকে অন্যান্য ক্লাসে অন্তর্ভুক্ত করুন। এটি কেবল DRY নীতি নিশ্চিত করার জন্য রুবি সরবরাহ করেছেন। সদৃশ এড়াতে এটি আপনার কোডটি ডিআরওয়াই করতে ব্যবহৃত হয়


2

অন্তর্ভুক্ত করা

আপনি যখন includeআপনার ক্লাসে কোনও মডিউল রেখেছেন, এমনভাবে যেন আপনি মডিউলটির মধ্যে সংজ্ঞায়িত কোডটি নিয়ে থাকেন এবং ক্লাসের মধ্যে সন্নিবেশ করান, যেখানে আপনি এটি 'অন্তর্ভুক্ত' করেন। এটি 'মিক্সিন' আচরণের অনুমতি দেয়। এটি আপনার কোডটি অনুলিপি এড়ানোর জন্য ব্যবহার করে, উদাহরণস্বরূপ, যদি একাধিক ক্লাস থাকে তবে মডিউলে একই কোডের প্রয়োজন হত।

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  include Log 
  # ... 
end

tc = TestClass.new.class_type # -> success
tc = TestClass.class_type # -> error

দরকার

প্রয়োজনীয় পদ্ধতি আপনাকে একটি লাইব্রেরি লোড করতে দেয় এবং এটিকে একবারের বেশি লোড হতে বাধা দেয়। আপনি প্রথমবারের পরে একই লাইব্রেরিটি লোড করার চেষ্টা করলে প্রয়োজনীয় পদ্ধতিটি 'মিথ্যা' ফিরে আসবে। প্রয়োজনীয় পদ্ধতিটি কেবল তখনই ব্যবহার করা প্রয়োজন যদি আপনি লোড করা লাইব্রেরি একটি পৃথক ফাইলে সংজ্ঞায়িত করা হয়, যা সাধারণত ক্ষেত্রে হয়।

সুতরাং এটি লাইব্রেরিটি ইতিমধ্যে লোড হয়েছিল কিনা তা ট্র্যাক করে রাখে। আপনার লাইব্রেরির ফাইলের নামের ".rb" এক্সটেনশন নির্দিষ্ট করার দরকার নেই। প্রয়োজনীয় ব্যবহার কীভাবে করা যায় তার একটি উদাহরণ এখানে। আপনার ".rb" ফাইলের একেবারে শীর্ষে প্রয়োজনীয় পদ্ধতিটি রাখুন:

বোঝা

লোড পদ্ধতিটি প্রায় প্রয়োজনীয় পদ্ধতির মতো এটি বাদ দিয়ে এটি যে লাইব্রেরিটি লোড হয়েছে কিনা তা ট্র্যাক করে না। সুতরাং একাধিকবার একটি লাইব্রেরি লোড করা সম্ভব এবং লোড পদ্ধতিটি ব্যবহার করার সময় আপনাকে অবশ্যই লাইব্রেরির ফাইলের নামের ".rb" এক্সটেনশনটি নির্দিষ্ট করতে হবে।

প্রসারিত করা

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

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  extend Log 
  # ... 
end

tc = TestClass.class_type

2

'লোড'- কোনও ফাইলের বিষয়বস্তু সন্নিবেশ করায় ((ফাইলটি প্রতিবার কল করার সময় পার্স করা)

'আবশ্যক'- একটি ফাইল পার্স করা সামগ্রী সন্নিবেশ করায় File (ফাইলটি একবার পার্স করা হয়েছে এবং মেমোরিতে সঞ্চয় করা হয়েছে)

'অন্তর্ভুক্ত' - ক্লাসে মডিউল অন্তর্ভুক্ত করে এবং মডিউলটির অভ্যন্তরের পদ্ধতিগুলি শ্রেণীর উদাহরণ পদ্ধতি হিসাবে ব্যবহার করতে পারে

'প্রসারিত' - ক্লাসে মডিউলটি অন্তর্ভুক্ত করে এবং মডিউলটির অভ্যন্তরের পদ্ধতিগুলি বর্গ পদ্ধতি হিসাবে ব্যবহার করতে পারে

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