সিম্বলগুলো হলো নামযুক্ত আইডেন্টিফায়ার, যা কোনো মান নির্দেশ করতে ব্যবহার করা যায়।
সিম্বল তৈরি হয় সিম্বল লিটারালের মাধ্যমে, অর্থাৎ একটি নামের আগে : ক্যারেক্টার বসিয়ে, যেমন :foo.
কোটেশন মার্ক দিয়েও এগুলো লেখা যায়, যেমন :"foo", যার ফলে নামের মধ্যে স্পেসও ব্যবহার করা যায়।
:foo # => :foo
:"foo boo" # => :"foo boo"
ভাষাটির অনেক জায়গায় সিম্বল ব্যবহৃত হয়, যেমন হ্যাশে কী (key) হিসেবে, কিংবা মেথডের নাম ও ভ্যারিয়েবলের নাম প্রকাশ করতে।
স্ট্রিং থেকে সিম্বলের পার্থক্য হলো, সিম্বল আসলে আইডেন্টিফায়ার, এরা কোনো ডেটা বা টেক্সট প্রকাশ করে না। এর মানে হলো, একই নামের দুটি সিম্বল সবসময় একই অবজেক্ট।
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
সিম্বল ইমিউটেবল, অর্থাৎ এগুলো পরিবর্তন করা যায় না। এর মানে হলো, আপনি যখন কোনো সিম্বল "পরিবর্তন" করেন, তখন আসলে একটি নতুন সিম্বল তৈরি হয়। সিম্বল নিয়ে কাজ করার জন্য কয়েকটি মেথড আছে, এগুলোর সবগুলোই নতুন সিম্বল রিটার্ন করে। সব মেথড Symbol API-তে পাওয়া যাবে।
:foo.upcase # => :FOO
:foo.object_id # => 1086748
:foo.upcase.object_id # => 60
সিম্বলের ইমিউটেবল হওয়ার সুবিধা হলো, এগুলো স্ট্রিংয়ের চেয়ে মেমোরিতে বেশি সাশ্রয়ী, আর আইডেন্টিফায়ার হিসেবে ব্যবহার করাও বেশি নিরাপদ।
সিম্বলকে স্ট্রিংয়ে রূপান্তর করা যায়, আবার উল্টোটাও।
কোনো সিম্বল পরিবর্তন করতে চাইলে, কিংবা কোনো সিম্বলকে স্ট্রিং হিসেবে ব্যবহার করতে চাইলে এটি কাজে লাগতে পারে।
কোনো স্ট্রিংকে সিম্বল হিসেবে উপস্থাপন করতে String#to_sym মেথডটি ব্যবহার করতে পারেন, আর উল্টোটা করতে Symbol#to_s মেথডটি।
সিম্বলে সীমিত সংখ্যক মেথড থাকায়, নতুন একটি সিম্বল দরকার হলে সিম্বলটিকে স্ট্রিংয়ে রূপান্তর করে তার উপর স্ট্রিংয়ের মেথড ব্যবহার করা কাজে লাগতে পারে।
:foo.to_s # => "foo"
"foo".to_sym # => :foo
প্যালার্মো বন্দরটি একটি ব্যস্ত সমুদ্রবন্দর, যেখানে অনেক জাহাজ আসা-যাওয়া করে। অনেক দিন ধরে বন্দরে বর্তমানে থাকা জাহাজগুলোর হিসাব রাখার জন্য এখানে একটি ম্যানুয়াল সিস্টেম চলে আসছিল। এই সিস্টেমে ভুল হওয়ার সম্ভাবনা খুব বেশি, তাই বন্দরের প্রধান এটি বদলে একটি কম্পিউটারভিত্তিক সিস্টেম বসানোর সিদ্ধান্ত নিয়েছেন।
নতুন সিস্টেমটি বাস্তবায়নের দায়িত্ব বন্দরের প্রধান আপনাকে দিয়েছেন। সিস্টেমটিকে জাহাজের আইডেন্টিফায়ার সামলাতে হবে, পাশাপাশি গন্তব্যেরও।
প্রথমে আপনাকে প্যালার্মো বন্দরের আইডেন্টিফায়ার তৈরি করতে হবে। আইডেন্টিফায়ারটি হলো বন্দরের নামের প্রথম চারটি অক্ষর, বড় হাতের অক্ষরে।
Port::IDENTIFIER কনস্ট্যান্টটিকে :PALE মানবিশিষ্ট একটি সিম্বল হিসেবে ডিফাইন করুন।
Port::IDENTIFIER
# => :PALE
প্রোগ্রামটিকে অন্য বন্দরগুলোও সামলাতে হবে, তাই সেগুলোর জন্যও আপনাকে আইডেন্টিফায়ার তৈরি করতে হবে। বন্দর কর্তৃপক্ষ সিস্টেমটি স্বয়ংক্রিয় করতে চায়, আর যেহেতু ভিন্ন ভিন্ন বন্দর ভিন্ন ভিন্ন নামকরণ রীতি ব্যবহার করে, তাই বন্দরের নাম থেকেই আইডেন্টিফায়ারগুলো তৈরি হওয়া উচিত। আইডেন্টিফায়ারটি হলো বন্দরের নামের প্রথম চারটি অক্ষর, বড় হাতের অক্ষরে।
Port.get_identifier মেথডটিকে ডিফাইন করুন, যাতে এটি আর্গুমেন্ট হিসেবে একটি স্ট্রিং নেয় এবং ওই বন্দরের আইডেন্টিফায়ার একটি সিম্বল হিসেবে রিটার্ন করে।
Port.get_identifier("Hamburg")
# => :HAMB
বন্দরটিতে দুটি টার্মিনাল আছে, আর কোন জাহাজ কোন টার্মিনালে ভিড়বে তা সিস্টেমটিকে নির্ধারণ করতে হবে। টার্মিনাল নির্ধারিত হয় জাহাজের আইডেন্টিফায়ার দিয়ে।
আইডেন্টিফায়ারটি দুটি অংশে গঠিত: প্রথম অংশটি বড় হাতের ৩টি অক্ষর দিয়ে তৈরি, যা বলে জাহাজটি কোন পণ্য বহন করছে, আর তারপর ৩টি সংখ্যা, যা জাহাজটির অনন্য আইডেন্টিফায়ার।
জাহাজের আইডেন্টিফায়ারে যদি OIL বা GAS থাকে, তাহলে জাহাজটিকে টার্মিনাল A-তে ভিড়তে হবে। অন্যথায় জাহাজটিকে টার্মিনাল B-তে ভিড়তে হবে।
Port.get_terminal মেথডটিকে ডিফাইন করুন, যাতে এটি আর্গুমেন্ট হিসেবে একটি সিম্বল নেয়, যা জাহাজটির আইডেন্টিফায়ার।
মেথডটি টার্মিনালটি একটি সিম্বল হিসেবে রিটার্ন করবে।
Port.get_terminal(:OIL123)
# => :A
Exercism-এ সাইন আপ করুন, Ruby ট্র্যাকের 21টি কনসেপ্ট121টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।