কম্পিউটার

রুবি আপনার কাছ থেকে ত্রুটি লুকাচ্ছে!

রুবি ইচ্ছাকৃতভাবে আপনার কাছ থেকে কিছু ত্রুটি এবং ব্যতিক্রম লুকিয়ে রাখবে।

কখনও কখনও এটি দরকারী হতে পারে৷

যেমন Kernel#loop ব্যবহার করার সময় ব্লক সহ পদ্ধতি, loop StopIteration হলে থামবে ব্যতিক্রম উত্থাপিত হয়৷

কিন্তু অন্য সময় এটি আপনার ডিবাগিং সেশনগুলিকে অনেক কঠিন করে তুলতে পারে৷

আসুন কিছু উদাহরণ দেখি!

লুকানো ব্যতিক্রম:তুলনামূলক মডিউল + <=> পদ্ধতি

প্রথম উদাহরণে Comparable জড়িত মডিউল এবং <=> পদ্ধতি।

এখানে উদাহরণ দেওয়া হল :

class MyObject
  attr_accessor :value

  include Comparable

  def initialize(value)
    @value = value
  end

  def <=>(other)
    raise ArgumentError, "can't compare #{other.class} with #{self.class}" unless other.is_a?(MyObject)

    value <=> other.valuee
  end
end

mo1 = MyObject.new(10)
mo2 = MyObject.new(10)

p mo1 == mo2

আসুন এই উদাহরণ সম্পর্কে কথা বলি।

প্রথম :

আমাদের MyObject নামে একটি ক্লাস আছে , একটি attr_accessor value সহ , এবং Comparable এর অন্তর্ভুক্তি মডিউল, যা তুলনা পদ্ধতি যোগ করে (যেমন == , < , > ) আমাদের ক্লাসে।

এই তুলনা পদ্ধতিগুলি <=>-এর উপর ভিত্তি করে পদ্ধতি।

ঠিক যেমন গণনাযোগ্য পদ্ধতিগুলি each এর উপর ভিত্তি করে পদ্ধতি।

তারপর :

আমরা দুটি বস্তু তৈরি করছি (MyObject.new ) একই মান সহ (10 )।

লক্ষ্য করুন যে তাদের একই মান থাকলেও তারা ভিন্ন বস্তু , এটি গুরুত্বপূর্ণ।

এখন যদি আমরা এই দুটি বস্তু mo1 তুলনা করি &mo2 আমরা false পাই …

কেন?

কারণ আমাদের <=> এ একটি ত্রুটি আছে পদ্ধতি, কিন্তু রুবি সেই ত্রুটি লুকাচ্ছে!

ঘনিষ্ঠভাবে দেখুন...

আপনি ত্রুটি খুঁজে পেতে পারেন?

আপনি যদি এটি ভাল কাজ খুঁজে পাওয়া যায়! না হলে ঠিক আছে 🙂

এটি এখানে :

value <=> other.valuee

এই valuee দেখুন ?

দেখা যাচ্ছে আমাদের একটি টাইপো আছে!

সাধারণত আমরা একটি NoMethodError পাব ব্যতিক্রম এবং আমরা খুব দ্রুত সমস্যা কি তা জানতে হবে. কিন্তু এই উদাহরণে নয়।

ভাল খবর হল রুবি 2.3 থেকে এটি পরিবর্তিত হয়েছে। আপনি এখন ত্রুটি দেখতে পাচ্ছেন কারণ এটি আর লুকানো নেই।

আপনি যদি এখনও পুরানো রুবি সংস্করণগুলি চালান তবে আপগ্রেড করার আরেকটি কারণ৷

লুকানো ব্যতিক্রম:সংখ্যাসূচক বস্তু + জবরদস্তি পদ্ধতি

লুকানো ব্যতিক্রমের আরেকটি উদাহরণ হল Numeric বস্তু (Float , Integer ) প্লাস coerce পদ্ধতি।

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

class MyObject
  attr_accessor :value

  def initialize(value)
    @value = value
  end

  def +(other)
    other = MyObject.new(other) if other.kind_of?(Numeric)

    value + other.value
  end

  def coerce(other)
    mo = MyObject.new
    mo.valuee = other

    [mo, self]
  end
end

mo1 = MyObject.new 10
mo2 = MyObject.new 10

p mo1 + mo2
# 20

p mo1 + 20
# 30

এটি আরেকটি MyObject ক্লাস, কিন্তু নতুন পদ্ধতির সাথে, + &coerce .

coerce পদ্ধতিটি আপনাকে দুটি বেমানান প্রকারের সাথে কাজ করার অনুমতি দেয় এবং তাদের একই প্রকারে রূপান্তর করতে দেয় যাতে তারা একসাথে কাজ করতে পারে।

এই ক্ষেত্রে আমাদের ক্লাস কিছু সাংখ্যিক মানের প্রতিনিধিত্ব করে, যা কয়েক সেকেন্ডের সংখ্যা, একটি মূল্য বা এরকম কিছু হতে পারে...

এবং আমরা এই ধরনের অপারেশন করতে সক্ষম হতে চাই :

mo1 + 20
20 + mo1

প্রথমটি (mo1 + 20 ) সহজ কারণ আমরা + নিয়ন্ত্রণ করি আমাদের ক্লাসে পদ্ধতি।

কিন্তু Integer সম্পর্কে কি ক্লাস?

আমরা পূর্ণসংখ্যার + পরিবর্তন করতে পারি এটি বাস্তবায়ন করার পদ্ধতি, কিন্তু এটি সম্ভবত একটি ভাল ধারণা নয় 🙂

সমাধান?

coerce প্রয়োগ করুন আপনার নিজের ক্লাসে পদ্ধতি।

এক জিনিস + Integer এ পদ্ধতি আপনার বস্তুটি এই পদ্ধতিটি প্রয়োগ করে কিনা তা পরীক্ষা করা হবে এবং যদি এটি করে তবে এটি কল করবে।

এখন, এই বিভাগের শুরুতে কোড উদাহরণ মনে রাখবেন?

যদি আমরা এটি করার চেষ্টা করি :

20 + mo1

আমরা 30 দেখতে চাই , কারণ mo1 এর মান হল 10 . কিন্তু আমরা যা দেখি তা হল:

MyObject can't be coerced into Fixnum

আগের মতোই একই সমস্যা!

coerce এর ভিতরে একটি ত্রুটি আমাদের থেকে লুকিয়ে রাখা হচ্ছে পদ্ধতি।

এটি:mo.valuee = other

আবার আমাদের একটি টাইপো আছে, কিন্তু ত্রুটিটি যা বলছে তা নয়!

MyObject can't be coerced into Fixnum

আপনার জন্য আমার কাছে সুসংবাদ আছে, রুবি 2.5-এ এই আচরণটি পরিবর্তিত হচ্ছে, তাই এটি আরেকটি লুকানো ত্রুটি দূর হবে তাই আপনাকে এটি নিয়ে চিন্তা করতে হবে না৷

সারাংশ

আপনি দেখতে পাচ্ছেন কেন আপনি ব্যতিক্রমগুলি লুকিয়ে রাখতে চান তার ভাল উদাহরণ। আপনি আমার বই রুবি ডিপ ডাইভ থেকে ব্যতিক্রম সম্পর্কে আরও জানতে পারেন৷

আপনি যদি এই পোস্টটি আপনার বন্ধুদের সাথে শেয়ার করেন তাহলে আমি কৃতজ্ঞ হব যাতে আরও বেশি লোক এটি দেখতে পারে৷

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


  1. রুবির জিসাব পদ্ধতি ব্যবহার করার 3টি দুর্দান্ত উপায়

  2. আপনি কোন রুবি আইডিই ব্যবহার করবেন?

  3. রুবি আলিয়াস কীওয়ার্ড কীভাবে ব্যবহার করবেন

  4. স্পটলাইট অনুসন্ধান থেকে ফোল্ডার লুকানো