রুবিতে কনস্ট্যান্ট কী?
একটি কনস্ট্যান্ট হলো একটি ভেরিয়েবলের টাইপ যা সবসময় বড় হাতের অক্ষরে শুরু হয়। সেগুলো শুধু বাহিরে মেথডের বাইরে সংজ্ঞায়িত করা যেতে পারে, যদি না আপনি মেটাপ্রোগ্রামিং ব্যবহার করেন।
কনস্ট্যান্টগুলো তাদের জন্য ব্যবহৃত হয় যেগুলো পরিবর্তন হওয়া উচিত নয়, কিন্তু রুবি আপনাকে সেগুলো পরিবর্তন করার থেকে বাধা দেয় না।
এগুলো এরকম দেখায়:
FRUIT = "orange"
এখন:
যেহেতু কনস্ট্যান্টগুলো একটি গুরুত্বপূর্ণ টপিক, আমরা এই নিবন্ধে সেগুলোকে বিস্তারিতভাবে অন্বেষণ করব!
কনস্ট্যান্ট সংজ্ঞায়িত করা
একটি কনস্ট্যান্টের জন্য কোনো স্পেশাল সিম্বল বা সিনট্যাক্সের প্রয়োজন নেই। আপনাকে শুধু প্রথম অক্ষরটি বড় হাতের করতে হবে।
নিচেরগুলো বৈধ কনস্ট্যান্ট:
ABC = 1 Goo = 2 Foo = 3
লক্ষ্য করুন আপনি মেথডের ভিতরে কনস্ট্যান্ট সংজ্ঞায়িত করতে পারবেন না।
আপনি এই গূঢ ত্রুটি বার্তা পাবেন:
def the_method ABC = 1 end # "dynamic constant assignment"
তাই আপনার কনস্ট্যান্টের সংজ্ঞাগুলো মেথডের বাইরে সংজ্ঞায়িত করুন, সাধারণত আমরা চাই ক্লাসের শীর্ষে কনস্ট্যান্ট সংজ্ঞা থাকা যাতে সেগুলো স্পষ্টভাবে দৃশ্যমান হয়।
class RubyBlog URL = "rubyguides.com" AUTHOR = "Jesus Castello" end
তারপর আপনি এই কনস্ট্যান্টগুলো ক্লাস মেথডগুলোর ভিতরে বা ক্লাসের বাইরে নিচের সিনট্যাক্স ব্যবহার করে অ্যাক্সেস করতে পারেন:
p RubyBlog::AUTHOR # "Jesus Castello"
কনস্ট্যান্টের স্কোপ নিয়ে আমরা এই পোস্টে পরে আরও কথা বলব, তাই সাথে থাকুন!
Uninitialized Constant Error
একটি সাধারণ ত্রুটি যা আপনি পেতে পারেন সেটি হলো:
puts Foo # "uninitialized constant Foo (NameError)"
আমি চাই আপনি এই ত্রুটিকে মানসিকভাবে "কনস্ট্যান্ট পাওয়া যায়নি" гэতে অনুবাদ করুন।
এই ত্রুটি বুঝতে একটি গুরুত্বপূর্ণ পয়েন্ট হলো রুবি ক্লাসগুলো কনস্ট্যান্ট।
উদাহরণ:
Array String Hash
সেগুলো কনস্ট্যান্ট কারণ প্রথম অক্ষরটি বড় হাতের।
যখন আপনি একটি ক্লাস সংজ্ঞায়িত করেন, আপনি আসলে একটি Class অবজেক্ট তৈরি করছেন, যা একটি কনস্ট্যান্টের সাথে অ্যাসাইন করা হয়।
কনস্ট্যান্টটি ক্লাসের নাম হয়ে যায়।
এটি কেন গুরুত্বপূর্ণ?
কারণ "uninitialized constant" ত্রুটি দেখার সবচেয়ে সম্ভাব্য কারণ হলো আপনি সেই কনস্ট্যান্টকে সংজ্ঞায়িতকারী ফাইল বা জেম require করা ভুলে গেছেন।
অথবা হয়তো আপনি কনস্ট্যান্টের নাম ভুল লিখেছেন।
তাই সেটির ওপর চোখ রাখুন।
কনস্ট্যান্টগুলো পরিবর্তন করা যেতে পারে
প্রবেশিকায় বলেছি যেমন, রুবি কনস্ট্যান্টগুলো পরিবর্তন করা যেতে পারে।
উদাহরণ:
ABC = 1 ABC = 2
কিন্তু আপনি এই সতর্কবার্তা বার্তা দেখবেন:
2: warning: already initialized constant ABC
আপনার প্রোগ্রাম ভালো কাজ করবে, কিন্তু আপনি এটি এড়াতে চাবেন।
কনস্ট্যান্টকে পরিবর্তন হতে বাধা দেওয়ার কোনো উপায় নেই কারণ রুবিতে ভেরিয়েবলগুলো কন্টেইনার নয়, সেগুলো স প্রakar অবজেক্টের দিকে পয়েন্টার।
অথবা লেবেল, আপনি পছন্দ করলে।
আপনি সর্বোত্তম করতে পারেন ইমিউটেবল অবজেক্ট ব্যবহার করা।
উদাহরণ:
AUTHOR = "Jesus Castello".freeze AUTHOR << "o" # RuntimeError: can't modify frozen String
সম্পর্কিত নিবন্ধ: রুবি মিউটেবিলিটি এবং freeze মেথড।
এই উদাহরণে, আপনি এখনও AUTHOR কনস্ট্যান্টটিকে যে দিকে পয়েন্ট করছে তা পরিবর্তন করতে পারেন, freeze শুধু অবজেক্টটিকে পরিবর্তন করা থেকে রক্ষা করে।
কনস্ট্যান্ট মেথডগুলো
কনস্ট্যান্ট নিয়ে কাজ করার জন্য কিছু ডেডিকেটেড মেথড আছে:
| মেথড | বিবরণ |
|---|---|
| constants | এক ক্লাসে সংজ্ঞায়িত কনস্ট্যান্টগুলোর প্রতীক বাচক সিম্বলের একটি অ্যারে রিটার্ন করে |
| const_get | একটি কনস্ট্যান্টের ভ্যালু রিটার্ন করে। প্যারামিটার হিসেবে সিম্বল বা স্ট্রিং নেয় |
| const_set | একটি কনস্ট্যান্টের ভ্যালু সেট করে। দুটি প্যারামিটার নেয়: কনস্ট্যান্টের নাম সিম্বল হিসেবে এবং কনস্ট্যান্ট ভ্যালু |
| const_missing | method_missing এর মতো কিন্তু কনস্ট্যান্টের জন্য |
| const_defined? | সত্য রিটার্ন করে যদি দেওয়া কনস্ট্যান্ট (সিম্বল হিসেবে) সংজ্ঞায়িত থাকে |
| remove_const | একটি কনস্ট্যান্ট সরিয়ে দেয় |
| private_constant | একটি কনস্ট্যান্ট প্রাইভেট করে দেয় যাতে সেটি Class::ABC সিনট্যাক্স দিয়ে ক্লাসের বাইরে থেকে অ্যাক্সেস করা যায় না |
এই মেথডগুলো ব্যবহার করে কিছু মেটাপ্রোগ্রামিং ট্রিক করা যায়।
উদাহরণ:
module Food class Bacon; end class Chocolate; end end puts "Classes defined inside #{Food}:" puts Food.constants এছাড়াও আপনি "Array" মতো একটি স্ট্রিং ব্যবহার করে আসল ক্লাস পেতে পারেন:
array_class = Object.const_get("Array") কিন্তু সেটির साथ সাবধান থাকুন কারণ যদি স্ট্রিংটি params বা ইউজার ইনপুটের অন্য কোনো ফর্ম থেকে আসে তবে কোড ইনজেক্ট করা সম্ভব।
রেইলসে, constantize মেথড আছে যা মূলত আপনার জন্য const_get করে, কিন্তু মনে রাখবেন এটি কোনো সিকিউরিটি চেক করে না।
চিটশিট

রুবি কনস্ট্যান্ট স্কোপ
যখন আপনি যেকোনো ক্লাসের বাইরে, আপনার কোডের টপ-লেভেলে একটি কনস্ট্যান্ট তৈরি করেন, সেই কনস্ট্যান্টটি সব জায়গায় উপলব্ধ থাকবে।
কনস্ট্যান্টগুলো চাইল্ড ক্লাসগুলোর জন্যও উপলব্ধ।
class A FOO = 1 end class B < A def foo puts FOO end end B.constants # [:FOO]
নেস্টেড মডিউল বা ক্লাসের বাইরে সংজ্ঞায়িত কনস্ট্যান্টগুলো নেস্টেড ক্লাসগুলোর ভিতরেও উপলব্ধ।
module Food STORE_ADDRESS = "The moon" class Bacon def foo; puts STORE_ADDRESS; end end end fb = Food::Bacon.new fb.foo # "The moon"
মডিউল মিক্সিং
মিক্সড-ইন মডিউল থেকে কনস্ট্যান্টগুলোর জন্যও উপলব্ধ:
module Mixin A = 123 end class Product include Mixin puts A end # 123
লক্ষ্য করুন এটি মডিউল ইনক্লুড করার সময় কাজ করে, এক্সটেন্ড করলে কাজ করবে না।
উদাহরণ:
class Product extend Mixin puts A end # uninitialized constant Product::A
এছাড়াও:
যখন আপনি একটি মডিউল থেকে ইনক্লুড করা একটি মেথড ব্যবহার করেন, রুবি সেই মেথড যেখানে সংজ্ঞায়িত তা থেকে শুরু করে কনস্ট্যান্ট খুঁজে বের করে।
উদাহরণ:
module Parent def print_value VALUE end end class Child include Parent VALUE = 1 end # Works p Child::VALUE # uninitialized constant Parent::VALUE p Child.new.print_value
এটি মনে রাখার একটি বিষয়!
মডিউল নেস্টিং
আমি নেস্টেড ক্লাসের সাথে এক উদাহরণ আরো দেখাতে চাই (মডিউলের জন্যও একই)।
class A FOO = 1 end class A::B class C puts FOO end end
A::B নোটেশন লক্ষ্য করুন, যা আমরা একটি শর্টকাট হিসেবে ব্যবহার করার চেষ্টা করলাম। কিন্তু সমস্যা হলো ক্লাস C সরাসরি FOO-এ অ্যাক্সেস করতে পারবে না।
সেই কারণে, আপনি এই ধরনের নেস্টিং-এ আটকে থাকতে চাবেন:
class A FOO = 1 end class A class B class C puts FOO end end end
প্রথম উদাহরণে, আপনি এখনও ::A::FOO করেই কনস্ট্যান্ট অ্যাক্সেস করতে পারেন, কিন্তু ক্লাসের নাম পরিবর্তন হলে আপনি ত্রুটি পাবেন।
এই ::A::FOO সিনট্যাক্সটি কাজ করে কারণ এটি রুবিকে টপ-লেভেল স্কোপে খুঁজতে বলে, যেখানে Array এবং String এর মতো কনস্ট্যান্ট সংজ্ঞায়িত থাকে।
ভিডিও
সারসংক্ষেপ
আপনি রুবি কনস্ট্যান্ট সম্পর্কে শিখেছেন, একটি ভেরিয়েবলের টাইপ যার কিছু আকর্ষণীয় আচরণ রয়েছে। আপনি কনস্ট্যান্টের ভ্যালু পরিবর্তন করতে পারেন কিন্তু এটি একটি সতর্কবার্তা প্রিন্ট করবে।
আপনি এছাড়াও শিখেছেন ক্লাসের নামগুলো কনস্ট্যান্ট এবং const_get ইউজার ইনপুটের সাথে ব্যবহার করা উচিত নয়।
যদি আপনি এই পোস্টটি উপভোগ করেছেন শেয়ার করা না ভুলেন যাতে আরও মানুষ কনস্ট্যান্ট কীভাবে কাজ করে তা বুঝতে পারে।