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


302

মধ্যে পার্থক্য কি require_relativeএবং requireরুবি মধ্যে?


9
1.9.2 এর পূর্বে প্রয়োজন_ সম্পর্কিত সম্পর্কিত কোন প্রয়োজন ছিল না, কারণ স্ক্রিপ্টের বর্তমান ডিরেক্টরিটি ছিল $:। দেখুন stackoverflow.com/questions/2900370
Nakilon

1
আবশ্যক_ সম্পর্কিত সম্পর্কিত একটি ফাইল বিশেষভাবে নির্দেশিত ফাইলের সাথে সম্পর্কিত যা এটি কল করে requires LOAD_PATH এ অন্তর্ভুক্ত একটি ফাইল প্রয়োজন require
দোনাতো

পার্থক্য সম্পর্কে দরকারী নিবন্ধ => মাঝারি.com
আহমেদ হামি

উত্তর:


298

শুধু তাকান ডক্স :

require_relativeবিবৃতি requireসম্বলিত ফাইলের সাথে সম্পর্কিত কোনও ফাইল লোড করার অনুমতি দিয়ে বিল্টিন পদ্ধতিটি পরিপূর্ণ করে require_relative

উদাহরণস্বরূপ, যদি আপনার "পরীক্ষা" ডিরেক্টরিতে ইউনিট পরীক্ষার ক্লাস থাকে এবং টেস্ট "টেস্ট / ডেটা" ডিরেক্টরিতে তাদের জন্য ডেটা থাকে, তবে আপনি পরীক্ষার ক্ষেত্রে এই জাতীয় একটি লাইন ব্যবহার করতে পারেন:

require_relative "data/customer_data_1"

28
তার মাঝে একটি পার্থক্য আছে কি require './file.rb'এবং require_relative 'file.rb'?
সিরো সান্তিলি :31 冠状 病 六四 事件 法轮功

69
পছন্দ করুন require_relativeআপনাকে " বিবৃতি সম্বলিতrequire_relative ফাইলের সাথে সম্পর্কিত যে কোনও ফাইল লোড করতে দেয় "। সহ require, ./এমন একটি পথ নির্দেশ করে যা আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিের সাথে সম্পর্কিত।
আজেদী 32

16
আমি মনে করি এটি নোট করা আরও গুরুত্বপূর্ণ যা require strসর্বদা $ LOAD_PATH ডিরেক্টরিতে অনুসন্ধান করবে। আপনার require_relativeলোড করার জন্য যে ফাইলটি লোড করার দরকার হবে সে ফাইলের সাথে তুলনামূলকভাবে অন্য কোথাও উপস্থিত থাকা উচিত । রিজার্ভ require"বহিরাগত" নির্ভরতা জন্য।
rthbound

97

require_relative এর একটি সুবিধাজনক উপসেট require

require_relative('path')

সমান:

require(File.expand_path('path', File.dirname(__FILE__)))

যদি __FILE__সংজ্ঞায়িত হয়, বা এটি উত্থাপিত হয়LoadError অন্যথায় হয়।

এটা ব্যাখ্যা করে যে:

  • require_relative 'a'এবং বর্তমান ফাইলেরrequire_relative './a' তুলনায় প্রয়োজন ( __FILE__)।

    আপনার লাইব্রেরির অভ্যন্তরে প্রয়োজনীয়তার সময় আপনি এটিই ব্যবহার করতে চান, যেহেতু আপনি ফলাফলটি কলারের বর্তমান ডিরেক্টরিতে নির্ভর করতে চান না।

  • eval('require_relative("a.rb")')LoadErrorকারণ উত্থাপন__FILE__ ভিতরে সংজ্ঞায়িত করা হয় না eval

    এই কারণেই আপনি require_relativeআরএসপেক পরীক্ষায় ব্যবহার করতে পারবেন না , যা পায়eval এড হয়।

নিম্নলিখিত ক্রিয়াকলাপগুলি কেবল এর সাথেই সম্ভব require:

  • require './a.rb'বর্তমান ডিরেক্টরি সম্পর্কিত আপেক্ষিক প্রয়োজন

  • require 'a.rb'$LOAD_PATHপ্রয়োজনীয় অনুসন্ধানের পথ ( ) ব্যবহার করে । এটি বর্তমান ডিরেক্টরি বা পাথের সাথে সম্পর্কিত ফাইলগুলি খুঁজে পায় না।

    এটি সহকারে সম্ভব নয় require_relativeকারণ ডক্স বলছে যে পথ অনুসন্ধান তখনই ঘটে যখন "ফাইল নামটি কোনও পরম পাথের সাথে সমাধান করে না" (অর্থাত শুরু হয় /বা ./বা../ ), যা সবসময় কেনার ক্ষেত্রে দেখা যায় File.expand_path

নিম্নলিখিত অপারেশন উভয়ের সাথেই সম্ভব, তবে আপনি ব্যবহার করতে চাইবেন require এটি খাটো এবং আরও দক্ষ হিসাবে :

  • require '/a.rb' এবং require_relative '/a.rb' উভয়েরই পরম পথের প্রয়োজন।

উত্স পড়া

দস্তাবেজগুলি পরিষ্কার না হলে, আমি আপনাকে উত্সগুলি দেখুন (দস্তাবেজের উত্স টগল করুন) দেখুন। কিছু ক্ষেত্রে এটি কী চলছে তা বুঝতে সহায়তা করে।

প্রয়োজন:

VALUE rb_f_require(VALUE obj, VALUE fname) {
  return rb_require_safe(fname, rb_safe_level());
}

require_relative:

VALUE rb_f_require_relative(VALUE obj, VALUE fname) {
    VALUE base = rb_current_realfilepath();
    if (NIL_P(base)) {
        rb_loaderror("cannot infer basepath");
    }
    base = rb_file_dirname(base);
    return rb_require_safe(rb_file_absolute_path(fname, base), rb_safe_level());
}

এটি আমাদের তা শেষ করতে দেয় allows

require_relative('path')

হিসাবে একই:

require(File.expand_path('path', File.dirname(__FILE__)))

কারণ:

rb_file_absolute_path   =~ File.expand_path
rb_file_dirname1        =~ File.dirname
rb_current_realfilepath =~ __FILE__

74

রুবি এপিআই থেকে :

প্রয়োজনীয়_ সম্পর্কিত সম্পর্কিত বিবরণটি প্রয়োজনীয় ফাইলের সাথে সম্পর্কিত এমন কোনও ফাইলকে লোড করার অনুমতি দিয়ে প্রয়োজনীয় বিল্টিন পদ্ধতির পরিপূরক করে।

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

উদাহরণস্বরূপ, যদি আপনার "পরীক্ষা" ডিরেক্টরিতে ইউনিট পরীক্ষার ক্লাস থাকে এবং টেস্ট "টেস্ট / ডেটা" ডিরেক্টরিতে তাদের জন্য ডেটা থাকে, তবে আপনি পরীক্ষার ক্ষেত্রে এই জাতীয় একটি লাইন ব্যবহার করতে পারেন:

require_relative "data/customer_data_1" 

যেহেতু "টেস্ট" বা "টেস্ট / ডেটা" উভয়ই রুবির লাইব্রেরির পথে (এবং সঙ্গত কারণে) হওয়ার সম্ভাবনা নেই, তাই কোনও সাধারণ প্রয়োজন তাদের খুঁজে পাবে না। প্রয়োজনীয়_ সম্পর্কিত সম্পর্কিত এই নির্দিষ্ট সমস্যার জন্য একটি ভাল সমাধান।

আপনি যে ফাইলটি লোড করছেন তাতে আপনি এক্সটেনশন (.rb বা .so) অন্তর্ভুক্ত বা বাদ দিতে পারেন।

পথ অবশ্যই to_str এ সাড়া দিতে হবে।

আপনি ডকুমেন্টেশনটি http://extensions.rubyforge.org/rdoc/classes/Kernel.html এ খুঁজে পেতে পারেন


50

সারসংক্ষেপ

requireইনস্টল রত্ন জন্য ব্যবহার করুন

require_relativeস্থানীয় ফাইলগুলির জন্য ব্যবহার করুন

requireআপনার $LOAD_PATHফাইলগুলি খুঁজে পেতে ব্যবহার করে।
require_relativeবিবৃতি ব্যবহার করে ফাইলের বর্তমান অবস্থান ব্যবহার করে


প্রয়োজন

প্রয়োজনীয়তা gem install [package]আপনার কার্যকারিতাটির জন্য আপনার সিস্টেমে কোথাও একটি প্যাকেজ ইনস্টল করার উপর নির্ভর করে ।

ব্যবহার করার সময় requireআপনি বর্তমান ডিরেক্টরিতে কোনও ফাইলের জন্য " " ফর্ম্যাট ব্যবহার করতে পারেন./ , উদাহরণস্বরূপ require "./my_file"তবে এটি সাধারণ বা প্রস্তাবিত অনুশীলন নয় এবং require_relativeপরিবর্তে আপনার ব্যবহার করা উচিত ।

require_relative

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

require_relative '../../../filename'

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

নোট করুন যে ফাইলটির বর্তমান ডিরেক্টরিটি প্রয়োজনীয়_ সম্পর্কিত সম্পর্কিত বিবৃতি সহrequire_relative ব্যবহার করে (সুতরাং আপনার বর্তমান ডিরেক্টরিটি যে আপনি কমান্ডটি ব্যবহার করছেন তা অগত্যা নয়)। এটি পথটিকে "স্থিতিশীল" রাখে কারণ এটি সর্বদা একইভাবে প্রয়োজনীয় ফাইলের সাথে সম্পর্কিত।require_relative


27

শীর্ষের উত্তরগুলি সঠিক, তবে গভীরভাবে প্রযুক্তিগত। রুবিতে নতুনদের জন্য:

  • require_relative সম্ভবত আপনি লিখেছেন এমন অন্য ফাইল থেকে কোড আনতে ব্যবহৃত হবে।

উদাহরণস্বরূপ, যদি আপনার কাছে ডেটা থাকে ~/my-project/data.rbএবং আপনি এটিতে অন্তর্ভুক্ত করতে চান ~/my-project/solution.rb? মধ্যে solution.rbআপনি যোগ হবে require_relative 'data'

এই ফাইলগুলি একই ডিরেক্টরিতে থাকার দরকার নেই তা লক্ষ করা গুরুত্বপূর্ণ। require_relative '../../folder1/folder2/data'বৈধ।

  • require সম্ভবত অন্য কোনও লিখিত গ্রন্থাগার থেকে কোড আনতে ব্যবহৃত হবে।

উদাহরণস্বরূপ, আপনি যদি active_supportলাইব্রেরিতে সরবরাহ করা কোনও সহায়ক ফাংশন ব্যবহার করতে চান ? আপনাকে রত্নটি ইনস্টল করতে হবে gem install activesupportএবং তারপরে ফাইলটিতে require 'active_support'

require 'active_support/all'
"FooBar".underscore

বলেছেন ভিন্নভাবে--

  • require_relative কল করে এমন ফাইলের তুলনায় বিশেষভাবে নির্দেশিত একটি ফাইলের প্রয়োজন।

  • requireএর মধ্যে অন্তর্ভুক্ত একটি ফাইল প্রয়োজন $LOAD_PATH


3
আমি কীভাবে এই উত্তরে ভোট দিতে পারি এবং এটিকে পুরোপুরি শীর্ষে আনতে পারি, তাই এই প্রশ্ন পৃষ্ঠার প্রতিটি দর্শক তাদের মস্তিষ্ক না ভাঙিয়ে সঙ্গে সঙ্গে একটি স্পষ্ট এবং বোধগম্য উত্তর পেয়ে যাবে?
ক্লান্ত

16

আমি কেবল দেখেছি আরএসপেকের কোডটিতে require_relativeও (1) ধ্রুবক এবং requireও (এন) লিনিয়ার হওয়ার বিষয়ে কিছু মন্তব্য আছে । সুতরাং সম্ভবত পার্থক্য যে require_relativeতুলনায় পছন্দসই এক require


1
মজাদার. আমি এখানে একটি গতির তুলনায় তথ্য খুঁজছি অবতরণ। আমার চিন্তাটি require_relativeতত দ্রুত ছিল কারণ লোডারটিকে ফাইলের সন্ধানে লোডের পথটি অতিক্রম করতে হবে না। মূলত, require_relativeএকটি সরাসরি লিঙ্ক সরবরাহ করে।
ক্লিন্ট পাচল

সম্পর্কে প্রারম্ভিক disscussion require_relative গতি এবং RSpec পরিবর্তণের
ক্লিন্ট পাচল

1

আমি যুক্ত করতে চাই যে উইন্ডোজ ব্যবহার করার সময় আপনি require './1.rb'স্ক্রিপ্টটি স্থানীয়ভাবে চালিত হলে বা ম্যাপযুক্ত নেটওয়ার্ক ড্রাইভ থেকে ব্যবহার করতে পারেন তবে যখন ইউএনসি \\servername\sharename\folderপাথ থেকে চালিত হন তখন আপনাকে ব্যবহার করতে হবেrequire_relative './1.rb'

অন্যান্য কারণে যেটি ব্যবহার করব তা নিয়ে আমি আলোচনায় মিশ্রিত হই না।


আমি জানতে চাই কিভাবে আপনি লোড করবেন চেয়েছিলেন require_relativeআপনি যে ফাইলটি দয়া করে এই সময়ে একটি ধারণা নিক্ষেপ গেল stackoverflow.com/questions/43487784/...
Emjey
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.