মধ্যে পার্থক্য কি require_relative
এবং require
রুবি মধ্যে?
মধ্যে পার্থক্য কি require_relative
এবং require
রুবি মধ্যে?
উত্তর:
শুধু তাকান ডক্স :
require_relative
বিবৃতিrequire
সম্বলিত ফাইলের সাথে সম্পর্কিত কোনও ফাইল লোড করার অনুমতি দিয়ে বিল্টিন পদ্ধতিটি পরিপূর্ণ করেrequire_relative
।উদাহরণস্বরূপ, যদি আপনার "পরীক্ষা" ডিরেক্টরিতে ইউনিট পরীক্ষার ক্লাস থাকে এবং টেস্ট "টেস্ট / ডেটা" ডিরেক্টরিতে তাদের জন্য ডেটা থাকে, তবে আপনি পরীক্ষার ক্ষেত্রে এই জাতীয় একটি লাইন ব্যবহার করতে পারেন:
require_relative "data/customer_data_1"
require './file.rb'
এবং require_relative 'file.rb'
?
require_relative
আপনাকে " বিবৃতি সম্বলিতrequire_relative
ফাইলের সাথে সম্পর্কিত যে কোনও ফাইল লোড করতে দেয় "। সহ require
, ./
এমন একটি পথ নির্দেশ করে যা আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিের সাথে সম্পর্কিত।
require str
সর্বদা $ LOAD_PATH ডিরেক্টরিতে অনুসন্ধান করবে। আপনার require_relative
লোড করার জন্য যে ফাইলটি লোড করার দরকার হবে সে ফাইলের সাথে তুলনামূলকভাবে অন্য কোথাও উপস্থিত থাকা উচিত । রিজার্ভ require
"বহিরাগত" নির্ভরতা জন্য।
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__
রুবি এপিআই থেকে :
প্রয়োজনীয়_ সম্পর্কিত সম্পর্কিত বিবরণটি প্রয়োজনীয় ফাইলের সাথে সম্পর্কিত এমন কোনও ফাইলকে লোড করার অনুমতি দিয়ে প্রয়োজনীয় বিল্টিন পদ্ধতির পরিপূরক করে।
যখন আপনার কোনও ফাইল লোড করার প্রয়োজন হয় তখন আপনি সাধারণত আপনার সিস্টেমে সঠিকভাবে ইনস্টল হওয়া কার্যকারিতা অ্যাক্সেস করতে এবং অ্যাক্সেসযোগ্য করে তোলেন। প্রকল্পের কোডের মধ্যে ফাইল লোড করার জন্য প্রয়োজনীয় কোনও ভাল সমাধান সরবরাহ করে না। এটি কোনও উন্নয়নের পর্যায়ে, পরীক্ষার ডেটা অ্যাক্সেস করার জন্য, এমনকি কোনও প্রকল্পের ভিতরে "লকড" থাকা ফাইলগুলি অ্যাক্সেসের জন্য, বাইরের ব্যবহারের উদ্দেশ্যে নয় এমন সময়ে কার্যকর হতে পারে।
উদাহরণস্বরূপ, যদি আপনার "পরীক্ষা" ডিরেক্টরিতে ইউনিট পরীক্ষার ক্লাস থাকে এবং টেস্ট "টেস্ট / ডেটা" ডিরেক্টরিতে তাদের জন্য ডেটা থাকে, তবে আপনি পরীক্ষার ক্ষেত্রে এই জাতীয় একটি লাইন ব্যবহার করতে পারেন:
require_relative "data/customer_data_1"
যেহেতু "টেস্ট" বা "টেস্ট / ডেটা" উভয়ই রুবির লাইব্রেরির পথে (এবং সঙ্গত কারণে) হওয়ার সম্ভাবনা নেই, তাই কোনও সাধারণ প্রয়োজন তাদের খুঁজে পাবে না। প্রয়োজনীয়_ সম্পর্কিত সম্পর্কিত এই নির্দিষ্ট সমস্যার জন্য একটি ভাল সমাধান।
আপনি যে ফাইলটি লোড করছেন তাতে আপনি এক্সটেনশন (.rb বা .so) অন্তর্ভুক্ত বা বাদ দিতে পারেন।
পথ অবশ্যই to_str এ সাড়া দিতে হবে।
আপনি ডকুমেন্টেশনটি http://extensions.rubyforge.org/rdoc/classes/Kernel.html এ খুঁজে পেতে পারেন
require
ইনস্টল রত্ন জন্য ব্যবহার করুনrequire_relative
স্থানীয় ফাইলগুলির জন্য ব্যবহার করুনrequire
আপনার $LOAD_PATH
ফাইলগুলি খুঁজে পেতে ব্যবহার করে।
require_relative
বিবৃতি ব্যবহার করে ফাইলের বর্তমান অবস্থান ব্যবহার করে
প্রয়োজনীয়তা gem install [package]
আপনার কার্যকারিতাটির জন্য আপনার সিস্টেমে কোথাও একটি প্যাকেজ ইনস্টল করার উপর নির্ভর করে ।
ব্যবহার করার সময় require
আপনি বর্তমান ডিরেক্টরিতে কোনও ফাইলের জন্য " " ফর্ম্যাট ব্যবহার করতে পারেন./
, উদাহরণস্বরূপ require "./my_file"
তবে এটি সাধারণ বা প্রস্তাবিত অনুশীলন নয় এবং require_relative
পরিবর্তে আপনার ব্যবহার করা উচিত ।
এর সহজ অর্থ হল ফাইলটি 'প্রয়োজনীয় অবস্থান সম্পর্কিত বিবৃতি সহ ফাইলের অবস্থানের সাথে সম্পর্কিত' অন্তর্ভুক্ত। আমি সাধারণত সুপারিশ করি যে ফাইলগুলি বর্তমান ডিরেক্টরি গাছে "আপ" এর বিপরীতে "ভিতরে" থাকা উচিত, উদাহরণস্বরূপ ব্যবহার করবেন না
require_relative '../../../filename'
(3 ডিরেক্টরি স্তর আপ) ফাইল সিস্টেমের মধ্যে কারণ এটি অপ্রয়োজনীয় এবং ভঙ্গুর নির্ভরতা তৈরি করতে ঝোঁক। তবে কিছু ক্ষেত্রে যদি আপনি ইতিমধ্যে ডিরেক্টরি গাছের মধ্যে 'গভীর' হন তবে অন্য ডিরেক্টরি ট্রি শাখা "উপরে এবং নীচে" প্রয়োজন হতে পারে। আরও সাধারণভাবে সম্ভবত, এই সংগ্রহস্থলের বাইরে ফাইলগুলির জন্য প্রয়োজনীয়_ সম্পর্কিত সম্পর্কিত ব্যবহার করবেন না (ধরে নিই যে আপনি গিট ব্যবহার করছেন যা মূলত এই মুহুর্তে 2018-এর শেষ দিকে একটি ডি-ফ্যাক্টো স্ট্যান্ডার্ড)।
নোট করুন যে ফাইলটির বর্তমান ডিরেক্টরিটি প্রয়োজনীয়_ সম্পর্কিত সম্পর্কিত বিবৃতি সহrequire_relative
ব্যবহার করে (সুতরাং আপনার বর্তমান ডিরেক্টরিটি যে আপনি কমান্ডটি ব্যবহার করছেন তা অগত্যা নয়)। এটি পথটিকে "স্থিতিশীল" রাখে কারণ এটি সর্বদা একইভাবে প্রয়োজনীয় ফাইলের সাথে সম্পর্কিত।require_relative
শীর্ষের উত্তরগুলি সঠিক, তবে গভীরভাবে প্রযুক্তিগত। রুবিতে নতুনদের জন্য:
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
।
আমি কেবল দেখেছি আরএসপেকের কোডটিতে require_relative
ও (1) ধ্রুবক এবং require
ও (এন) লিনিয়ার হওয়ার বিষয়ে কিছু মন্তব্য আছে । সুতরাং সম্ভবত পার্থক্য যে require_relative
তুলনায় পছন্দসই এক require
।
require_relative
তত দ্রুত ছিল কারণ লোডারটিকে ফাইলের সন্ধানে লোডের পথটি অতিক্রম করতে হবে না। মূলত, require_relative
একটি সরাসরি লিঙ্ক সরবরাহ করে।
আমি যুক্ত করতে চাই যে উইন্ডোজ ব্যবহার করার সময় আপনি require './1.rb'
স্ক্রিপ্টটি স্থানীয়ভাবে চালিত হলে বা ম্যাপযুক্ত নেটওয়ার্ক ড্রাইভ থেকে ব্যবহার করতে পারেন তবে যখন ইউএনসি \\servername\sharename\folder
পাথ থেকে চালিত হন তখন আপনাকে ব্যবহার করতে হবেrequire_relative './1.rb'
।
অন্যান্য কারণে যেটি ব্যবহার করব তা নিয়ে আমি আলোচনায় মিশ্রিত হই না।
require_relative
আপনি যে ফাইলটি দয়া করে এই সময়ে একটি ধারণা নিক্ষেপ গেল stackoverflow.com/questions/43487784/...
$:
। দেখুন stackoverflow.com/questions/2900370