ইকুয়ালিটি মানে দুটি জিনিস একই। রুবিতে, আমরা অবজেক্টগুলো এবং তাদের ভ্যালু কমপেয়ার করি সেগুলো একই অবজেক্ট কিনা জানতে।
প্রশ্নটি হলো…
রুবিতে দুটি জিনিস কীভাবে কমপেয়ার করবেন?
এভাবে:
1 == 1 # true
আপনি সম্ভবত ইতিমধ্যে এর সাথে পরিচিত…
কিন্তু কি আপনি জানেন == একটি মেথড এবং শুধু সিনট্যাক্স নয়?
ন্ফলাফলগুলো বড়।
আপনি আপনার নিজস্ব ক্লাসগুলিতে এই মেথডটি ইমপ্লিমেন্ট করতে পারেন সেগুলোকে আরও শক্তিশালী করতে। এবং সেটিই আপনি এই পোস্টে শিখবেন!
দুটি অবজেক্ট কী একটি করে তোলে?
আপনি দুটি স্ট্রিং এইভাবে কমপেয়ার করতে পারেন:
"foo" == "foo"
যদি শব্দ এবং ক্যারেক্টার একই থাকে, তবে সেগুলো সমান।
এক্সপ্রেশনটি true রিটার্ন করে।
এটি কাজ করে কারণ String ক্লাস একটি == (দুটি ইকুয়াল সাইন) মেথড ইমপ্লিমেন্ট করে যা জানে স্ট্রিং কীভাবে কমপেয়ার করতে হয়।
কিন্তু যদি String == ইমপ্লিমেন্ট না করে তাহলে?
তब রুবি Object-এর == ইমপ্লিমেন্টেশন ব্যবহার করবে, যা ডিফল্টভাবে অবজেক্ট আইডেন্টিটি টেস্ট করে, অবজেক্ট কন্টেন্টের বদলে।
উদাহরণ:
Object.new == Object.new # false String.new == String.new # true
Object false রিটার্ন করে কারণ দুটি নতুন অবজেক্টের আলাদা অবজেক্ট আইডি থাকে।
String-এর কেসে, যেহেতু এটি কন্টেন্ট বেজড কমপেয়ার করে, এবং দুটি নতুন স্ট্রিংর কন্টেন্ট একই (সেগুলো খালি) তাই এটি true রিটার্ন করে।
ইকুয়ালিটি ইমপ্লিমেন্ট করা
এখন আপনি যা শিখলেন সেটি ব্যবহার করে আপনার নিজস্ব ক্লাসগুলোক আরও শক্তিশালী করুন সেগুলো কমপেয়ারেবল করে।
== মেথডের সৌজন্যে…
আপনি সঠিকভাবে ডিফাইন করতে পারেন আপনার নিজস্ব ক্লাসের দুটি ইনস্ট্যান্স কখন সমান বলে মনে করা হয়।
উদাহরণ:
class Product attr_reader :name, :price def initialize(name, price) @name, @price = name, price end def ==(other) self.name == other.name && self.price == other.price end end p1 = Product.new('book', 49) p2 = Product.new('book', 49) p1 == p2 # true == মেথডটি বলে যে নাম এবং দাম দুটোই একই হলে দুটি Product অবজেক্ট সমান বলা হবে।
মনে রাখবেন:
আপনি যদি এই মেথডটি ইমপ্লিমেন্ট না করেন (বা Comparable মডিউল ব্যবহার না করেন, যা আমি আমার রুবি বইয়ে ব্যাখ্যা করেছি) তবে দুটি অবজেক্ট তাদের অবজেক্ট আইডি দিয়ে কমপেয়ার করা হবে, তাদের ভ্যালুর বদলে।
এছাড়াও আমি বলতে চাই Struct ব্যবহার করলে সেটি ইতিমধ্যে == আপনার জন্য ইমপ্লিমেন্ট করে দিয়েছে।
ট্রিপল ইকুয়ালস (===) কী?
আপনি হয়তো চিন্তিত হচ্ছেন যদি == একটি মেথড, তবে ===ও কি একটি মেথড? এবং উত্তর হ্যাঁ 🙂
তাহলে দুটির পার্থক্য কী?
জাভাস্ক্রিপ্টে একটি স্পষ্ট পার্থক্য আছে, যেখানে == অবজেক্ট টাইপগুলো একই করার চেষ্টা করে যদি সেগুলো একই না হয় (1 vs '1')। এবং === 'স্ট্রিক্ট' ইকুয়ালিটির জন্য।
কিন্তু রুবিতে এমন জিনিস নেই। === কী মানে সেটি ক্লাসের ওপর নির্ভর করে যা সেটি ইমপ্লিমেন্ট করছে।
অনেক কেসে এটি শুধু ==-এর অ্যালিয়াস।
String এবং Object-এর মতো।
এখানে বিল্ট-ইন ক্লাসগুলোর একটি টেবিল যারা ===-কে স্পেশাল মানে দেয়:
| ক্লাস | অর্থ |
|---|---|
| Range | সত্য রিটার্ন করে যদি obj রেঞ্জের একটি এলিমেন্ট হয়, মিথ্যা অন্যথায়। |
| Regexp | রেগেক্সপ কে একটি স্ট্রিংয়ের সাথে ম্যাচ করে। |
| Module | সত্য রিটার্ন করে যদি obj mod-এর একটি ইনস্ট্যান্স হয় বা mod-এর ডিসেন্ডেন্টদের ইনস্ট্যান্স। |
| Proc | obj কে প্রসেসর প্যারামিটার হিসেবে ব্লককে ইনভোক করে Proc#call এর মতো। এটি একটি প্রসেসর অবজেক্টকে কেস স্টেটমেন্টে when ক্লজের টার্গেট করার অনুমতি দেয়। |
উপসংহার
এই পোস্টে আপনি শিখেছেন কীভাবে == মেথড ইমপ্লিমেন্ট করে আপনার ক্লাসগুলোক আরও শক্তিশালী করতে হয়। আপনি == এবং ===-এর পার্থক্যও শিখেছেন।
এই পোস্ট শেয়ার করা না ভুলেন যাতে আরও মানুষ এটা দেখতে পারে 🙂