আপনি যদি আগে রুবির ব্যতিক্রমগুলির সাথে কাজ করে থাকেন তবে আপনি জানেন কোন ব্যতিক্রমগুলি উদ্ধার করা হবে এবং কোনটি নয় তা আপনি নির্দিষ্ট করতে পারেন:
begin
raise ArgumentError
rescue ArgumentError
# Rescues the `ArgumentError`
end
...এবং আপনি সম্ভবত জানেন যে আপনি যখন একজন "পিতামাতা"কে উদ্ধার করেন তখন আপনি তার সমস্ত "সন্তান"কেও উদ্ধার করেন।
begin
raise ArgumentError
rescue StandardError
# Rescues `ArgumentError`, because it inherits from
# `StandardError`
end
যখন আমি "পিতামাতা" এবং "সন্তান" বলি আমি কেবল শ্রেণী উত্তরাধিকার উল্লেখ করছি। রুবি সোর্স কোডের গভীরে কোথাও এর সমতুল্য কিছু আছে:
class ArgumentError < StandardError
...
end
একটি আকর্ষণীয় কৌশল
এখানে আমার প্রশ্ন:রুবি কিভাবে জানবে যে কোনো প্রদত্ত ব্যতিক্রম আপনার নির্দিষ্ট করা ক্লাস থেকে উত্তরাধিকারসূত্রে পাওয়া যায়?
সবচেয়ে সুস্পষ্ট পদ্ধতি হল is_a?
ব্যবহার করা অথবা kind_of?
পদ্ধতি আমরা এটিকে এইরকম দেখতে কল্পনা করতে পারি:
if the_exception.is_a?(StandardError)
# do the rescue
end
কিন্তু যা হয় তা নয়। পরিবর্তে, রুবি আরও আকর্ষণীয় ===
ব্যবহার করে অপারেটর.
if StandardError === the_exception
# do the rescue
end
আপনি যদি কখনও a === b
ব্যবহার না করে থাকেন , এটি সাধারণত প্রশ্নের উত্তর দেয় "একটি কি অন্তর্নিহিতভাবে b দ্বারা সংজ্ঞায়িত গ্রুপের অন্তর্গত"? এখানে কিছু উদাহরণ আছে:
(1..10) === 5 # true
('a'..'f') === "z" # false
String === "hello" # true
String === 1 # false
/[0-9]{3}/ === "hello123" # true
/[0-9]{3}/ === "hello" # false
কারণ ===
==
এর মত একটি সাধারণ রুবি পদ্ধতি , আমরা নিজেরাই এটি সংজ্ঞায়িত করতে পারি:
class RedThings
def self.===(thing)
thing.color == :red
end
end
তাই, আমরা কি জানি? আমরা জানি যে rescue
===
ব্যবহার করে কোন ব্যতিক্রমগুলি উদ্ধার করা হবে তা নির্ধারণ করতে। এবং আমরা জানি যে আমরা আমাদের নিজস্ব ===
সংজ্ঞায়িত করতে পারি পদ্ধতি তার মানে আমরা এমন একটি শ্রেণী তৈরি করতে পারি যা সিদ্ধান্ত নেয় যে কোন ব্যতিক্রমগুলি উদ্ধার করা হবে:
class SevereMatcher
def self.===(exception)
exception.message =~ /severe/
end
end
begin
raise RuntimeError, "Something severe happened"
rescue SevereMatcher
# rescues all exceptions with the word "severe" in
# the message, regardless of class.
end
একবার আপনি এই কৌশলটি জানলে, একমাত্র সীমা হল আপনার কল্পনা।
উপসংহার
আমি স্বীকার করব:আপনাকে কখনও একটি গতিশীল ব্যতিক্রম ম্যাচার তৈরি করতে হবে না। কিন্তু ===
ব্যবহার করার মত আপাতদৃষ্টিতে-তুচ্ছ বাস্তবায়নের বিশদটি কীভাবে তার একটি সত্যিই আকর্ষণীয় উদাহরণ। kind_of?
এর পরিবর্তে রুবিকে অনেক বেশি নমনীয় এবং আকর্ষণীয় করে তোলে।