কম্পিউটার টিউটোরিয়াল

রুবিতে Dup বনাম Clone: অবজেক্ট কপি করার কৌশলকে মাস্টার করুন

আপনি কি জানতেন রুবিতে আপনি একটি অবজেক্ট কপি করতে পারেন? শুধু তো নয়, এর জন্য দুটি ভিন্ন মেথড রয়েছে!

এই মেথডগুলো হলো:

  • dup
  • clone

আমরা পার্থক্যগুলো একক্ষণে এক্সপ্লোর করব, কিন্তু তার আগে…

আপনি একটি অবজেক্ট ক্লোন কেন করবেন?

রুবিতে অনেক অবজেক্ট মিউটেবল, আপনি সেগুলো পরিবর্তন করতে পারেন। আপনি যদি একটি অবজেক্ট পরিবর্তন করতে চান কিন্তু মূল অবজেক্টের একটি কপি রাখতে চান তবে আপনি এটাকে ক্লোন করতে পারেন।

উদাহরণস্বরূপ। আপনি একটি অ্যারে চান যেখানে সব এলিমেন্ট থাকে কিন্তু প্রথমটি নয়।

একটি পদ্ধতি:

a = [1,2,3,4,5] 
a[1..-1] # [2,3,4,5]

আরেকটি পদ্ধতি হবে:

b = a.clone 
b.shift # [1] 
b # [2,3,4,5]

দুটি উদাহরণই আপনাকে মূল অ্যারেটি রাখতে দেয়।

রুবিতে Dup বনাম Clone: অবজেক্ট কপি করার কৌশলকে মাস্টার করুন

ফ্রোজেন অবজেক্ট

dup এবং clone একে অপরের এলিয়াস নয় যেভাবে অন্যান্য রুবি মেথডের (map/collect) ক্ষেত্রে হয়, তাদের মধ্যে কয়েকটি ছোট পার্থক্য রয়েছে।

দুই জিনিসের সাম্য ও পার্থক্য অন্বেষণ করা আপনার বোঝাপড়া উন্নত করার একটি চমৎকার পদ্ধতি।

দুই মেথডই একটি অবজেক্ট কপি করে, পার্থক্য হলো dup অবজেক্ট অ্যাট্রিবিউট কপি করে না।

কী অবজেক্ট অ্যাট্রিবিউট?

  • ফ্রোজেন স্ট্যাটাস
  • টেইন্টেড স্ট্যাটাস
  • সিঙ্গলটন ক্লাস

এখানে একটি উদাহরণ:

a = Object.new.freeze 
b = a.dup 
b.frozen? # false 
b = a.clone 
b.frozen? # true

রুবি ২.৪-এ clone-এ একটি অপশন যোগ করা হয়েছে ফ্রোজেন স্ট্যাটাস ইগনোর করার জন্য।

উদাহরণ:

a.clone(freeze: true) 
a.clone(freeze: false)

ডিপ বনাম শ্যালো কপি

অবজেক্ট কপি করার বিষয়ে চোখে যা দেখায় তার চেয়ে বেশি কিছু রয়েছে।

আপনি যখন একটি কপি বানান, dup বা clone দিয়ে, আপনি একটি শ্যালো কপি বানাচ্ছেন।

এটি মানে অন্য অবজেক্টের ভেতরে থাকা অবজেক্টগুলো কপি হবে না।

অন্য কথায়:

আপনার কাছে একটি স্ট্রিং অ্যারে থাকলে, শুধু অ্যারেটি কপি হবে, স্ট্রিংগুলো নয়।

নিজে দেখুন:

original = %w(apple orange banana) 
copy = original.clone 
original.map(&:object_id) # [23506500, 23506488, 23506476] 
copy.map(&:object_id) # [23506500, 23506488, 23506476]

ক্লোন করার পরেও অবজেক্ট আইডিগুলো একই, তাই আমাদের একই স্ট্রিং রয়েছে।

আপনি এভাবে সমাধান করতে পারেন:

strings.clone.map(&:clone)

এতে অ্যারে এবং স্ট্রিং দুটোই ক্লোন হবে, কিন্তু লক্ষ্য করুন এটি শুধু এক লেভেল ডিপ। আপনি ActiveSupport-এর deep_dup মেথডও ট্রাই করতে পারেন বিকল্প হিসেবে।

সারসংক্ষেপ

আপনি রুবিতে অবজেক্ট ক্লোনিং সম্পর্কে শিখলেন! যার মধ্যে dup এবং clone মেথডের পার্থক্য, এবং শ্যালো কপি বনাম ডিপ কপি।

পড়ার জন্য ধন্যবাদ!

  1. রুবিতে সিলেকশন সর্ট মাস্টার করুন: স্টেপ-বাই-স্টেপ ইমপ্লিমেন্টেশন

  2. রুবি দিয়ে ইন্সারশন সর্টিং দক্ষতা অর্জন: ধাপে ধাপে গাইড

  3. রুবি আউটপুট বেসিকস: puts, print এবং p-এর মধ্যে নির্বাচন

  4. রুবি অবজেক্ট ডেকোরেটর প্যাটার্ন দিয়ে সমৃদ্ধ করুন: একটি প্র্যাক্টিক্যাল গাইড