একটি সিম্বল এরকম দেখায়:
:testing
কিছু লোক সিম্বলকে ভেরিয়েবলের সাথে গুলিয়ে ফেলে, কিন্তু তাদের ভেরিয়েবলের সাথে কিছুই নেই...
...একটি সিম্বল অনেক বেশি স্ট্রিং-এর মতো।
তাহলে রুবি সিম্বল এবং স্ট্রিং-এর মধ্যে পার্থক্য কী?
স্ট্রিং ব্যবহার হয় ডেটা নিয়ে কাজ করতে।
সিম্বল হলো আইডেন্টিফায়ার।
এটিই প্রধান পার্থক্য:
সিম্বল শুধু অন্য একটি ধরনের স্ট্রিং নয়, তাদের একটি ভিন্ন উদ্দেশ্য আছে।
সিম্বল কখন ব্যবহার করবেন
সিম্বলের সবচেয়ে সাধারণ ব্যবহারগুলোর একটি হলো মেথড এবং ইনস্ট্যান্স ভেরিয়েবল নাম রিপ্রেজেন্ট করা।
উদাহরণ:
attr_reader :title
attr_reader-এর পরে :title সেটি একটি সিম্বল যা @title ইনস্ট্যান্স ভেরিয়েবলকে রিপ্রেজেন্ট করে।
আপনি সিম্বলকে হ্যাশ কীও হিসেবে ব্যবহার করতে পারেন।
উদাহরণ:
hash = {a: 1, b: 2, c: 3}
সুবিধাগুলো?
সিম্বল দেখতে ভালো লাগে, সেগুলো ইমমিউটেবল এবং যদি আপনি স্ট্রিং কী বনাম সিম্বল কী বেঞ্চমার্ক করেন তবে আপনি দেখবেন স্ট্রিং কী প্রায় ১.৭০ গুণ ধীর।
ইমমিউটেবল বলতে আমার মানে প্রতিটি সিম্বল ইউনিক, এবং এটি পরিবর্তন করা যায় না:
:rubyguides.object_id # 437768 :rubyguides.object_id # 437768
এই দুটি সিম্বল একই অবজেক্ট কারণ তাদের একই object id আছে।
সিম্বল মেটাপ্রোগ্রামিং মেথডগুলোতে ব্যবহার করা যায় যেমন send:
[1,2,3].send(:first)
সংক্ষেপে:
আপনার সিম্বল ব্যবহার করা উচিত নাম বা লেবেল হিসেবে জিনিসগুলোর জন্য (যেমন মেথড) এবং স্ট্রিং ব্যবহার করুন যখন আপনি ডেটা (ইন্ডিভিজুয়াল ক্যারেক্টার) নিয়ে বেশি চিন্তিত।
স্ট্রিং এবং সিম্বলের মধ্যে রূপান্তর
আপনি প্রয়োজন অনুযায়ী একটি সিম্বলকে স্ট্রিং-এ রূপান্তর করতে পারেন।
কেন আপনি এটি করতে চাবেন?
কারণ সিম্বলগুলোর শুধু স্ট্রিং-এর মেথডের একটি সাবসেট থাকে।
এবং সিম্বলগুলো পরিবর্তন করা যায় না, তাই যদি আপনি সিম্বলটির ইন্ডিভিজুয়াল ক্যারেক্টার নিয়ে কাজ করতে চান তবে আপনার একটি স্ট্রিং দরকার।
আপনি এটি to_s মেথড দিয়ে করতে পারেন।
উদাহরণস্বরূপ, method_missing ব্যবহার করার সময় আপনি মিসিং মেথডের নাম একটি সিম্বল হিসেবে পান। আপনি চাইতে পারেন এই মেথড নামটি একটি নির্দিষ্ট প্যাটার্নের সাথে মিলে কিনা (যেমন ? দিয়ে শেষ হয় কিনা)।
উদাহরণ:
def method_missing(method_name, *args, &block)
if method_name.to_s[-1] == "?"
# কিছু করুন
else
super
end
end
আপনি একটি স্ট্রিং অবজেক্টকেও একটি সিম্বল অবজেক্টে রূপান্তর করতে পারেন।
এটি করার মেথড হলো String#to_sym:
"rubyguides".to_sym # :rubyguides
সিম্বলের একটি অ্যারে তৈরি করা
যদি আপনি সিম্বলদের একটি অ্যারে তৈরি করতে চান তবে আপনি এই কোডটি ব্যবহার করতে পারেন:
symbols = %i(a b c) # [:a, :b, :c]
এটি আপনাকে কোলন এবং কমা টাইপ করার থেকে বাঁচায়।
স্ট্রিং ভার্সন %w-এর মতো:
strings = %w(a b c) # ["a", "b", "c"]
রুবি সিম্বল ভিডিও
সিম্বল GC (এডভান্সড)
সিম্বল সম্পর্কে আরেকটি আকর্ষণীয় তথ্য হলো এর ভিন্ন ধরন আছে।
কারণ হলো রুবি ২.২-এর আগে সিম্বলগুলো গার্বেজ কালেক্টেড নয়, অর্থাৎ রেগুলার রুবি অবজেক্টের মতো (স্ট্রিং, হ্যাশ, অ্যারে...) যখন আর দরকার নেই তবে মেমরি থেকে ক্লিন আপ হয় না।
আপনি একটি উদাহরণ দেখতে পারেন এখানে:
p Symbol.all_symbols.size # 2443
('aa'..'aj').map(&:to_sym)
GC.start
p Symbol.all_symbols.size # 2453
আপনি লক্ষ্য করবেন সিম্বলের মোট কাউন্ট ১০ বাড়েছে, ঠিক যেমন আপনি আশা করবেন যেহেতু আমরা ১০টি নতুন সিম্বল তৈরি করছি।
কিন্তু রুবি ২.২ থেকে এই সিম্বলগুলো মেমরি থেকে রিমুভ হয়ে যায় কারণ সেগুলো শুধু مؤقت এবং এই কোডে অন্য কিছু দ্বারা ব্যবহার করা হচ্ছে না।
আপনি যদি এই কোডটি সিম্বল GC সক্রিয় থাকা একটি রুবি ভার্সনে ট্রাই করেন তবে দুটি সিম্বল কাউন্ট একই হবে।
কিছু সিম্বল কখনো মেমরি থেকে রিমুভ হয় না, এদেরকে "ইমমর্টাল সিম্বল" বলা হয়।
আপনি ObjectSpace মডিউল ব্যবহার করে সেগুলো কাউন্ট করতে পারেন:
require 'objspace'
ObjectSpace.count_symbols # {:mortal_dynamic_symbol=>3, :immortal_dynamic_symbol=>5, :immortal_static_symbol=>3663, :immortal_symbol=>3668}
লক্ষ্য করুন সরাসরি তৈরি করা সিম্বল, যেমন :a1 অটোমেটিক্যালি ইমমর্টাল সিম্বল হয়ে যায়। একটি নতুন মেথড তৈরি করলেও একটি immortal_static_symbol তৈরি হয় সেটির সাথে।
তাহলে মর্টাল সিম্বল কোথা থেকে আসে?
স্ট্রিংকে সিম্বলে রূপান্তর করার সময় to_sym মেথড দিয়ে।
আপনি এটি নিজেও চেক করতে পারেন ObjectSpace.count_symbols ব্যবহার করে।
এবং আপনি যদি জানতে চান immortal_dynamic_symbol কী, এটি হলো একটি সিম্বল যা মর্টাল থেকে ইমমর্টালে প্রোমোট হয়েছে। এটি ঘটতে পারে যখন আপনি একটি মর্টাল সিম্বলের নামে একটি মেথড তৈরি করেন।
সারসংক্ষেপ
এই আর্টিকেলে আপনি শিখতে পেরেছেন:
- সিম্বল ইমমিউটেবল
- সিম্বল ভ্যালুকে পয়েন্টার নয়, তারা নিজেই ভ্যালু
- স্ট্রিং ডেটার জন্য এবং সিম্বল আইডেন্টিটির জন্য
- স্ট্রিং এবং সিম্বলের মধ্যে কীভাবে রূপান্তর করবেন
- রুবি ২.২-এ সিম্বল GC চালু হয়েছে مؤقت সিম্বল ক্লিন আপ করার জন্য
আশা করি আপনি কিছু নতুন শিখতে পেরেছেন!
দয়া করে এই পোস্টটি শেয়ার করুন যাতে এটি আরও মানুষের কাছে পৌঁছাতে পারে 🙂