একটি প্রতীক এই মত দেখায়:
:testing
কিছু লোক চিহ্নকে ভেরিয়েবলের সাথে বিভ্রান্ত করে, কিন্তু ভেরিয়েবলের সাথে তাদের কোন সম্পর্ক নেই...
…একটি প্রতীক অনেকটা স্ট্রিংয়ের মতো .
তাই রুবি প্রতীক এবং স্ট্রিং মধ্যে পার্থক্য কি?
ডেটা এর সাথে কাজ করতে স্ট্রিং ব্যবহার করা হয় .
চিহ্ন হল শনাক্তকারী .
এটাই প্রধান পার্থক্য:
প্রতীক শুধুমাত্র অন্য ধরনের স্ট্রিং নয়, তাদের একটি ভিন্ন উদ্দেশ্য আছে।
কখন প্রতীক ব্যবহার করবেন
প্রতীকগুলির জন্য সবচেয়ে সাধারণ ব্যবহারগুলির মধ্যে একটি হল পদ্ধতি এবং উদাহরণ পরিবর্তনশীল নামগুলিকে উপস্থাপন করা .
উদাহরণ :
attr_reader :title
:title
attr_reader এর পরে একটি প্রতীক যা @title
প্রতিনিধিত্ব করে ইনস্ট্যান্স ভেরিয়েবল।
আপনি হ্যাশ কী হিসাবে প্রতীকগুলিও ব্যবহার করতে পারেন৷
উদাহরণ :
hash = {a: 1, b: 2, c: 3}
সুবিধা?
চিহ্নগুলি দেখতে আরও ভাল, সেগুলি অপরিবর্তনীয় এবং আপনি যদি স্ট্রিং কী বনাম প্রতীক কীগুলি বেঞ্চমার্ক করেন তবে আপনি দেখতে পাবেন যে স্ট্রিং কীগুলি প্রায় 1.70x ধীর।
অপরিবর্তনীয় দ্বারা আমি বলতে চাচ্ছি যে প্রতিটি প্রতীক অনন্য , এবং এটি পরিবর্তন করা যাবে না:
:rubyguides.object_id # 437768 :rubyguides.object_id # 437768
এই দুটি প্রতীক একই বস্তু কারণ তাদের একই অবজেক্ট আইডি আছে।
চিহ্নগুলি মেটাপ্রোগ্রামিং পদ্ধতিতে ব্যবহার করা যেতে পারে যেমন send
:
[1,2,3].send(:first)
সংক্ষেপে :
আপনার নাম হিসেবে চিহ্ন ব্যবহার করা উচিত অথবা জিনিসগুলির জন্য লেবেল (যেমন পদ্ধতি) এবং স্ট্রিং ব্যবহার করুন যখন আপনি ডেটা সম্পর্কে আরও যত্নশীল হন (স্বতন্ত্র অক্ষর)।
স্ট্রিং এবং চিহ্নের মধ্যে রূপান্তর
প্রয়োজনে আপনি একটি প্রতীককে একটি স্ট্রিংয়ে রূপান্তর করতে পারেন৷
কেন আপনি এটা করতে চান?
কারণ প্রতীকে শুধুমাত্র একটি স্ট্রিং এর পদ্ধতির একটি উপসেট থাকে।
এবং প্রতীক পরিবর্তন করা যাবে না, তাই আপনি যদি প্রতীকের পৃথক অক্ষরগুলির সাথে কাজ করতে চান তবে আপনি একটি স্ট্রিং চান৷
আপনি to_s
ব্যবহার করে এটি করতে পারেন পদ্ধতি।
উদাহরণস্বরূপ, method_missing
ব্যবহার করার সময় আপনি একটি প্রতীক হিসাবে অনুপস্থিত পদ্ধতির নাম পাবেন। আপনি এই পদ্ধতির নামটি একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে কিনা তা পরীক্ষা করতে চাইতে পারেন (যেমন ?
দিয়ে শেষ হচ্ছে )।
উদাহরণ :
def method_missing(method_name, *args, &block) if method_name.to_s[-1] == "?" # do something 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 (উন্নত)
প্রতীক সম্পর্কে আরেকটি আকর্ষণীয় তথ্য হল বিভিন্ন প্রকার রয়েছে।
কারণ হল রুবি 2.2 এর আগে প্রতীকগুলি আবর্জনা সংগ্রহ করা হয়নি, যার মানে হল যে সেগুলি মেমরি থেকে পরিষ্কার করা হয় না যখন নিয়মিত রুবি অবজেক্টের (স্ট্রিং, হ্যাশ, অ্যারে...) মতো প্রয়োজন হয় না।
আপনি এখানে একটি উদাহরণ দেখতে পারেন৷ :
p Symbol.all_symbols.size # 2443 ('aa'..'aj').map(&:to_sym) GC.start p Symbol.all_symbols.size # 2453
আপনি লক্ষ্য করবেন যে চিহ্নের মোট সংখ্যা 10 বেড়েছে, ঠিক যেমনটি আপনি আশা করছেন যেহেতু আমরা 10টি নতুন চিহ্ন তৈরি করছি।
কিন্তু রুবি 2.2 থেকে এই চিহ্নগুলি মেমরি থেকে মুছে ফেলা হয়েছে কারণ এগুলি কেবল অস্থায়ী এবং এই কোডের অন্য কিছু দ্বারা ব্যবহার করা হচ্ছে না৷
আপনি যদি রুবির একটি সংস্করণে এই কোডটি চেষ্টা করেন যাতে সিম্বল জিসি সক্ষম করা আছে উভয় প্রতীকের সংখ্যা একই হবে৷
কিছু প্রতীক কখনোই স্মৃতি থেকে মুছে ফেলা হবে না, এগুলোকে "অমর প্রতীক" বলা হয়।
আপনি অবজেক্টস্পেস মডিউল ব্যবহার করে তাদের গণনা করতে পারেন:
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
কি? , এটি একটি প্রতীক যা নশ্বর থেকে অমর হয়ে উন্নীত হয়েছে। এটি ঘটতে পারে যখন আপনি একটি নশ্বর প্রতীকের নাম দিয়ে একটি পদ্ধতি তৈরি করেন।
সারাংশ
এই নিবন্ধে আপনি শিখেছেন:
- চিহ্নগুলি অপরিবর্তনীয়
- প্রতীকগুলি মানগুলির নির্দেশক নয়, তারা নিজেরাই মান
- স্ট্রিংগুলি ডেটার জন্য এবং প্রতীকগুলি পরিচয়ের জন্য ৷
- কীভাবে স্ট্রিং এবং চিহ্নের মধ্যে রূপান্তর করতে হয়
- অস্থায়ী প্রতীকগুলি পরিষ্কার করার জন্য রুবি 2.2-এ প্রতীক GC চালু করা হয়েছিল
আশা করি আপনি নতুন কিছু শিখেছেন!
অনুগ্রহ করে এই পোস্টটি শেয়ার করুন যাতে এটি আরও বেশি মানুষের কাছে পৌঁছাতে পারে 🙂