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

রুবির Self কিওয়ার্ড বোঝা: কার্যকরভাবে ব্যবহার করার স্পষ্ট গাইড

আপনি যদি রুবি শিখছেন, তবে আপনি “self” কিওয়ার্ডের ব্যবহার খুব কনফিউজিং পেতে পারেন।

এটি কীভাবে কাজ করে?

self কী, সঠিকভাবে?

এটি একটি রুবি কিওয়ার্ড যা আপনাকে বর্তমান অবজেক্টে অ্যাক্সেস দেয়।

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

এই “বর্তমান অবজেক্ট” কনটেক্সটের উপর নির্ভর করে।

কনটেক্সট?

হ্যাঁ, কনটেক্সট হলো আপনার কোড যেকোনো মুহূর্তে أين অবস্থিত।

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

যদি আপনার কোড একটি ইনস্ট্যান্স মেথডের ভিতরে থাকে, self হলো সেই ক্লাসের একটি ইনস্ট্যান্স। অন্য কথায়, self হলো একটি অবজেক্ট।

আপনি নিজে এটিকে অ্যাকশনে দেখতে পারেন।

এই কোডটি রান করুন:

 def coffee puts self end coffee # main 

এই কোড একটি coffee মেথড ডিফাইন ও কল করে যা self এর ভ্যালু প্রিন্ট করে।

কেন এটি main প্রিন্ট করে?

কারণ এটি টপ-লেভেল অবজেক্টের নাম, এটি একটি অবজেক্ট যেখানে আপনি সকল মেথড পাবেন যা বাহিরে একটি ক্লাসের ডিফাইন করা আছে।

যেমন আমাদের coffee মেথড এখানে।

কিন্তু আপনি যদি একটি মেথড ডিফাইন করেন Cat নামক একটি ক্লাসের ভিতরে, তবে self হবে একটি Cat অবজেক্ট।

এখানে দেখা যাচ্ছে:

 class Cat def meow puts self end end Cat.new.meow # <Cat:0x7a14c5> 

এই উদাহরণগুলো থেকে, আমরা বলতে পারি যে self এর ভ্যালু পরিবর্তন হয় সেটি কোথায় ব্যবহার করা হচ্ছে সেটার ওপর নির্ভর করে।

এখন:

আমি বিশ্বাস করি আপনি যেকোনো জিনিস ভালোভাবে বুঝতে পারেন তার উদ্দেশ্য বুঝলে।

self কেন উপকারী?

চলুন কিছু উদাহরণ দেখি।

ডিস्अ্যাম্বিগুয়েশনের জন্য Self ব্যবহার করা

self-এর একটি প্র্যাকটিক্যাল ব্যবহার হলো একটি মেথড এবং একটি লোকাল ভেরিয়েবলের মধ্যে পার্থক্য বলতে সক্ষম হওয়া।

একটি ভেরিয়েবল এবং একটি মেথড একই নাম দেয়া একটি ভালো আইডিয়া নয়। কিন্তু আপনি যদি সেটি হ্যান্ডল করতে বাধ্য হন, তবে আপনি self.method_name দিয়ে মেথডটি কল করতে পারবেন।

এখানে আমার ক্যাহার অর্থ:

 class Example def do_something banana = "variable" puts banana puts self.banana end def banana "method" end end Example.new.do_something # "variable" => puts banana # "method" => puts self.banana 

এখানে আমাদের কাছে একটি banana লোকাল ভেরিয়েবল আছে, do_something মেথডের ভিতরে, কিন্তু আমাদের কাছে একটি banana মেথডও আছে।

একটি লোকাল ভেরিয়েবল প্রায়োরিটি পায়।

সেজন্য আমাদের এখানে self ব্যবহার করতে হবে যদি আমরা banana মেথড কল করতে চাই, banana ভেরিয়েবলের ভ্যালু প্রিন্ট করার পরিবর্তে।

পরবর্তীতে:

চলুন একটি আরও সাধারণ ইউজ কেস দেখি… ক্লাস মেথড ডিফাইন করা!

ক্লাস-লেভেল মেথড ডিফাইন করতে Self ব্যবহার করা

নাম্বার وان self-এর ব্যবহার, কোনো সন্দেহ ছাড়া, হলো ক্লাস-লেভেল মেথড ডিফাইন করা।

আমি নিশ্চিত আপনি এগুলো দেখেছেন।

এই def self.method_name মেথড ডেফিনিশনগুলো।

একটি এরকম:

 class Salad def self.buy_olive_oil # ... end end Salad.buy_olive_oil 

এখানে এই self সমতুল্য Salad, ক্লাসের নাম।

এটি কেন উপকারী?

কারণ আমাদের প্রতিটি মেথড ডেফিনিশনের জন্য ক্লাসের নাম ব্যবহার করতে হয় না, যা আমাদের কোড পরিবর্তন করা সহজ করে তোলে যদি আমরা ক্লাস পরিবর্তন করি।

এটি কোডকে কম নויזি এবং পড়তে আরও ভালো করে।

সেজন্য আমরা def Salad.buy_olive_oil এর পরিবর্তে def self.buy_olive_oil করি।

Self-এর অন্যান্য ব্যবহার

হ্যাঁ!

self-এর আরও ব্যবহার রয়েছে, তাই এটি পরিচিত থাকা সহায়ক।

উদাহরণস্বরূপ:

আপনি একটি মেথডে এটি ব্যবহার করতে পারেন বর্তমান অবজেক্টকে অন্য একটি অবজেক্টের সাথে তুলনা করতে।

একটি এরকম কিছু:

 def ==(other) self == other end 

আপনি self ডিবাগিং উদ্দেশ্যেও ব্যবহার করতে পারেন, জানতে আপনি কোন অবজেক্টের সাথে কাজ করছেন।

এভাবে:

 p self 

অথবা আপনি এটি রিটার্ন ভ্যালু হিসেবে ব্যবহার করতে পারেন, বিল্ডার ডিজাইন প্যাটার্ন ইমপ্লিমেন্ট করতে।

উদাহরণ:

 class Salad def initialize @ingredients = [] end def add_nuts @ingredients << :nuts self end end my_salad = Salad.new.add_nuts 

সংক্ষেপে, self-এর সাহায্যকারী ব্যবহারের একটি তালিকা:

  • ক্লাস-লেভেল মেথড ডিফাইন করা
  • একটি ইনস্ট্যান্স মেথড ব্যবহার করা যখন আপনার কাছে একই নামের একটি লোকাল ভেরিয়েবল আছে
  • Self রিটার্ন করা (বিল্ডার প্যাটার্ন)
  • ডিবাগিং
  • অবজেক্ট তুলনা (==)
  • মেথড কলের ডিফল্ট রিসিভার

Self vs Itself

এই টপিক শেষ করার আগে আমাদের আরেকটি জিনিস দেখতে হবে।

Kernel#itself মেথড।

এটি একটি মেথড যা আপনি একটি অবজেক্টে কল করতে পারেন এবং অবজেক্টটি নিজে আপনাকে রিটার্ন করবে।

উদাহরণ:

 [1,2,3,nil].select(&:itself) # [1, 2 ,3] 

এই উদাহরণ nil এবং false ভ্যালু ফিল্টার করে।

পার্থক্য বোঝা:

  • self একটি কিওয়ার্ড। এর ভ্যালু নির্ভর করে কোথায় আপনি এটি ব্যবহার করছেন
  • itself একটি মেথড। এর ভ্যালু নির্ভর করে কিসের ওপর আপনি এটি ব্যবহার করছেন (এখানে 1.itself-এ, 1 হল অবজেক্ট)

আশা করি এটি সহায়ক।

উপসংহার

আপনি রুবি self কিওয়ার্ড সম্পর্কে শিখেছেন, সঠিকভাবে সেটি কী, কেন এটি উপকারী এবং কীভাবে ব্যবহার করতে হয়।

এখন আপনার বاری এটি ট্রাই করার।

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


  1. রুবি Enumerable মেথড মাস্টারিং: Any, All, None এবং One

  2. রুবির grep মেথড মাস্টারিং: কোড উদাহরণসহ একটি ব্যবহারিক গাইড

  3. রুবির Map মেথড মাস্টারিং: উদাহরণসহ একটি ব্যবহারিক গাইড

  4. রুবি Struct ও OpenStruct: দক্ষ ভ্যালু অবজেক্টস