আজ আমি self সম্পর্কে কথা বলতে চাই . আপনি যদি কিছুক্ষণের জন্য রুবি প্রোগ্রামিং করে থাকেন, তাহলে আপনি সম্ভবত self এর ধারণাটি অভ্যন্তরীণভাবে তৈরি করেছেন। . যখনই আপনি একটি প্রোগ্রাম পড়বেন বা লিখবেন, self আপনার মনের পিছনে আছে.
কিন্তু কম-অভিজ্ঞ রুবিস্টদের জন্য, self বিস্মিত হতে পারে। এটি সর্বদা পরিবর্তনশীল, তবে এটি কখনই স্পষ্টভাবে কোডে দেখানো হয় না। আপনি শুধু জানতে আশা করছি.
নতুনদের অনেক সমস্যার সম্মুখীন হতে হয় self না বোঝার কারণে . আপনি যদি কখনও একটি ইন্সট্যান্স ভেরিয়েবল "হারিয়ে ফেলেন" বা মিক্সিনে কোন ডেটা দৃশ্যমান তা নিয়ে বিভ্রান্ত হয়ে থাকেন, তাহলে আপনি self বুঝতে পারেননি। সেই প্রেক্ষাপটে
এই পোস্টে, আমরা self দেখতে যাচ্ছি প্রতিদিনের বিভিন্ন পরিস্থিতিতে।
self কি ?
আপনি লোকেদের বলতে শুনেছেন যে রুবির সবকিছুই একটি বস্তু। যদি এটি সত্য হয় তবে এর অর্থ হল যে কোডের প্রতিটি অংশ যা আপনি লিখছেন তা কিছু বস্তুর "অর্ন্তভুক্ত"।
self একটি বিশেষ ভেরিয়েবল যা সেই বস্তুর দিকে নির্দেশ করে যা বর্তমানে এক্সিকিউটিং কোডের "মালিক"। রুবি self ব্যবহার করে সর্বত্র:
- উদাহরণ ভেরিয়েবলের জন্য:
@myvar - পদ্ধতি এবং ধ্রুবক সন্ধানের জন্য
- পদ্ধতি, ক্লাস এবং মডিউল সংজ্ঞায়িত করার সময়।
তাত্ত্বিকভাবে, self বেশ সুস্পষ্ট। কিন্তু বাস্তবে, কঠিন পরিস্থিতিতে পপ আপ করা সহজ। সেজন্যই এই পোস্টটি লিখলাম।
self এর উদাহরণ
আমরা এখন বেশ কয়েকটি উদাহরণের মাধ্যমে ধাপে ধাপে যাচ্ছি। যদি প্রথমটি আপনার জন্য খুব মৌলিক বলে মনে হয় তবে শুধু পড়তে থাকুন। তারা আরো উন্নত হয়.
ইনস্ট্যান্স পদ্ধতির ভিতরে
নীচের কোডে, reflect একটি উদাহরণ পদ্ধতি। এটি আমাদের Ghost.new এর মাধ্যমে তৈরি করা বস্তুর অন্তর্গত . তাই self সেই বস্তুর দিকে নির্দেশ করে।
class Ghost
def reflect
self
end
end
g = Ghost.new
g.reflect == g # => true
শ্রেণী পদ্ধতির ভিতরে
এই উদাহরণের জন্য, reflect Ghost এর একটি ক্লাস পদ্ধতি . শ্রেণী পদ্ধতির সাথে, শ্রেণী নিজেই পদ্ধতিটির "মালিক"। self ক্লাসের দিকে নির্দেশ করে।
class Ghost
def self.reflect
self
end
end
Ghost.reflect == Ghost # => true
এটি মডিউলগুলির ভিতরে "শ্রেণী" পদ্ধতির সাথে একই কাজ করে। যেমন:
module Ghost
def self.reflect
self
end
end
Ghost.reflect == Ghost # => true
মনে রাখবেন, রুবিতে ক্লাস এবং মডিউলগুলিকে অবজেক্ট হিসাবে বিবেচনা করা হয়। সুতরাং এই আচরণটি আমরা প্রথম উদাহরণে যে উদাহরণ পদ্ধতির আচরণ দেখেছি তার থেকে ভিন্ন নয়।
একটি ক্লাস বা মডিউল সংজ্ঞার ভিতরে
রুবির একটি বৈশিষ্ট্য যা এটিকে রেলের মতো ফ্রেমওয়ার্কের জন্য এতটা উপযুক্ত করে তোলে যে আপনি ক্লাস এবং মডিউল সংজ্ঞার মধ্যে নির্বিচারে কোড চালাতে পারেন। আপনি যখন একটি ক্লাস/মডিউল সংজ্ঞার ভিতরে কোড রাখেন, তখন এটি অন্য রুবি কোডের মতোই চলে। শুধুমাত্র আসল পার্থক্য হল self এর মান .
আপনি নীচে দেখতে পাচ্ছেন, self শ্রেণী বা মডিউলকে নির্দেশ করে যা সংজ্ঞায়িত করার প্রক্রিয়ায় রয়েছে।
class Ghost
self == Ghost # => true
end
module Mummy
self == Mummy # => true
end
ইনসাইড মিক্সিন পদ্ধতি
মিক্সড-ইন পদ্ধতিগুলি "স্বাভাবিক" উদাহরণের মতো আচরণ করে বা self এর ক্ষেত্রে ক্লাস পদ্ধতির মতো আচরণ করে . এইবার বুঝতে পারছি. অন্যথায় মিক্সিন আপনি যে ক্লাসে এটি মিশ্রিত করেছেন তার সাথে যোগাযোগ করতে সক্ষম হবে না।
ইনস্ট্যান্স পদ্ধতি
যদিও reflect পদ্ধতিটি মডিউলে সংজ্ঞায়িত করা হয়েছিল, এটির self এটি যে ক্লাসে মিশ্রিত হয়েছিল তার উদাহরণ।
module Reflection
def reflect
self
end
end
class Ghost
include Reflection
end
g = Ghost.new
g.reflect == g # => true
ক্লাস পদ্ধতি
যখন আমরা extend করি ক্লাস পদ্ধতিতে মেশানোর জন্য একটি ক্লাস, self এটি স্বাভাবিক ক্লাস পদ্ধতিতে ঠিক মত আচরণ করে।
module Reflection
def reflect
self
end
end
class Ghost
extend Reflection
end
Ghost.reflect == Ghost # => true
মেটাক্লাসের ভিতরে
আপনি একবারে প্রচুর ক্লাস পদ্ধতি সংজ্ঞায়িত করার জন্য এই জনপ্রিয় শর্টকাটটি দেখেছেন এমন সম্ভাবনা রয়েছে।
class Ghost
class << self
def method1
end
def method2
end
end
end
class << foo সিনট্যাক্স আসলে বেশ আকর্ষণীয়. এটি আপনাকে একটি বস্তুর মেটাক্লাস অ্যাক্সেস করতে দেয় - যাকে "সিঙ্গেলটন ক্লাস" বা "ইজেনক্লাস"ও বলা হয়। আমি ভবিষ্যতের পোস্টে আরও গভীরভাবে মেটাক্লাসগুলি কভার করার পরিকল্পনা করছি। কিন্তু আপাতত, আপনাকে শুধু জানতে হবে যে মেটাক্লাস হল যেখানে রুবি এমন পদ্ধতি সঞ্চয় করে যা একটি নির্দিষ্ট বস্তুর জন্য অনন্য।
আপনি যদি self অ্যাক্সেস করেন class << foo এর ভিতর থেকে ব্লক, আপনি মেটাক্লাস পাবেন।
class << "test"
puts self.inspect
end
# => #<Class:#<String:0x007f8de283bd88>
যেকোনো ক্লাসের বাইরে
আপনি যদি কোনো ক্লাসের বাইরে কোড চালান, রুবি এখনও self প্রদান করে . এটি "প্রধান" নির্দেশ করে, যা Object এর একটি উদাহরণ :
puts self.inspect # => main