কম্পিউটার

কোন ব্যতিক্রমগুলি ধরতে হবে তা জানার জন্য মার্জিত কৌশল উদ্ধার করে

আপনি যদি আগে রুবির ব্যতিক্রমগুলির সাথে কাজ করে থাকেন তবে আপনি জানেন কোন ব্যতিক্রমগুলি উদ্ধার করা হবে এবং কোনটি নয় তা আপনি নির্দিষ্ট করতে পারেন:

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? এর পরিবর্তে রুবিকে অনেক বেশি নমনীয় এবং আকর্ষণীয় করে তোলে।


  1. কোন iPhone 13 রঙ আপনার জন্য সবচেয়ে ভালো?

  2. iPhone বনাম Android:আপনার জন্য কোনটি সঠিক?

  3. ফেডোরা বনাম উবুন্টু:কোনটি আপনার জন্য?

  4. অ্যালো বনাম হোয়াটসঅ্যাপ:আপনার জন্য কোনটি ভালো?