Crystal-এ Nil নামের একটি টাইপ আছে, যার একটিমাত্র মান থাকতে পারে: nil।
এটি কোনো মানের অনুপস্থিতি বোঝাতে ব্যবহৃত হয়, এবং অন্য ভাষার null বা None-এর মতোই।
nil মান বিভিন্ন মেথড থেকে রিটার্ন হতে পারে, যেমন String#[]?, যা ইনডেক্স সীমার বাইরে থাকলে nil রিটার্ন করে।
"foo"[10]? # => nil
Crystal-এ তথাকথিত নাল রেফারেন্স চেক আছে, যার অর্থ হলো সব টাইপ ডিফল্টভাবে নন-নিলেবল।
এর মানে হলো, কোনো ভ্যারিয়েবলকে স্পষ্টভাবে Nil টাইপ হিসেবে ডিক্লেয়ার না করলে আপনি তাতে nil অ্যাসাইন করতে পারবেন না।
এর ফলে কম্পাইলার স্বয়ংক্রিয়ভাবে নাল রেফারেন্স যাচাই করে।
nil মান সামলাতে কিছু পদ্ধতি অবলম্বন করা যায়।
nil একটি ফলসি মান, আর false-ও তাই।
এর মানে হলো, যেসব স্টেটমেন্ট বা অন্য জায়গায় ফলসি বা ট্রুথি মান প্রত্যাশিত, সেখানে এটিকে false-এর মতোই ধরা হবে।
if nil
puts "nil is truthy"
else
puts "nil is falsey"
end
# => nil is falsey
এর মানে হলো, কোনো নিলেবল ভ্যারিয়েবলের মান nil হলে ট্রুথি শাখাটি নেওয়া হবে না।
foo = "boo"[2]? # It is possible that foo is nil
if foo
p foo.class # => Char
end
nil যাচাই করাকোনো মান nil কি না তা যাচাই করতে Crystal-এ একটি মেথড আছে।
এর নাম nil?, এবং এটি সব অবজেক্টেই পাওয়া যায়।
foo = "boo"[2]?
if foo.nil?
puts "foo is nil"
else
puts "foo is not nil"
end
কেবল একটি if স্টেটমেন্টে মানটি ব্যবহার করার চেয়ে এটি একটু আলাদা, কারণ আগের উদাহরণগুলোতে false এবং nil দুটোকেই false হিসেবে ধরা হয়েছিল।
এখানে কেবল nil-ই ফলসি হিসেবে ধরা হয়, কারণ মানটি false হলে সেটি nil হতো না, ফলে সেটি ট্রুথি হতো।
nil মান সামলানোর সবচেয়ে সহজ উপায় হলো শুরুতেই নিশ্চিত করা যে সেগুলো কখনো nil হবে না।
অর অপারেটর (||) প্রায়ই Bools নিয়ে কাজ করার সময় ব্যবহৃত হয়, তবে সঠিকভাবে বুঝলে এটি nil মান সামলাতেও ব্যবহার করা যায়।
অর অপারেটর দেখে প্রথম মানটি ট্রুথি কি না; না হলে দ্বিতীয় মানটি ব্যবহৃত হয়।
এভাবে ব্যবহার করলে মানটি nil হলে সেটি ফলসি হবে এবং তাই দ্বিতীয় মানটি ব্যবহৃত হবে।
"foo"[10]? || "bar" # => "bar"
মহারানি কালমার ইউনিয়নের রাজধানী কোপেনহেগেনে একটি ডিনার পার্টির আয়োজন করছেন। এটি বছরের সবচেয়ে বড় পার্টি এবং সব অভিজাত ব্যক্তিকে আমন্ত্রণ জানানো হয়েছে। কিন্তু দেশজুড়ে গুজব ছড়াচ্ছে যে মহারানিকে বিষ খাওয়ানোর একটি ষড়যন্ত্র চলছে।
মহারানি আপনাকে, রাজদরবারের বিষ-অনুসন্ধানকারী হিসেবে, খুঁজে বের করতে বলেছেন খাবার বা পানীয়ের মধ্যে কোনোটিতে বিষ আছে কি না। মহারানি খাবার হিসেবে শুধু Mushroom pasties পরিবেশনের পরিকল্পনা করেছেন, তবে পানীয়ের ক্ষেত্রে নানা ধরনের পানীয় থাকবে।
মহারানি যা অর্ডার করেছেন তা যদি খাবার না হয়, তাহলে খাবারে বিষ থাকার সম্ভাবনা অনেক বেশি। খাবার যদি মহারানির অর্ডার করা জিনিস না হয়, তাহলে তা ফেলে দেওয়া উচিত।
check_food? মেথডটি ইমপ্লিমেন্ট করুন, যা food আর্গুমেন্ট নেয়, যেখানে খাবারের নাম একটি String হিসেবে থাকে।
খাবারটি Mushroom pasties হলে মেথডটি সেই খাবার রিটার্ন করবে; অন্যথায় এটি nil রিটার্ন করবে।
CastleDinner.check_food?("Mushroom pasties")
# => "Mushroom pasties"
CastleDinner.check_food?("Bread")
# => nil
পানীয়ে বিষ থাকাও সম্ভব, তবে তা আছে কি না বোঝা একটু কঠিন।
পানীয়ের নামে i অক্ষরটি না থাকলে সেই পানীয়ে বিষ আছে বলে ধরে নিতে হবে; অক্ষর ছোট হাতের না বড় হাতের, সেটা কোনো ব্যাপার নয়।
পানীয়ে বিষ থাকলে তা ফেলে দেওয়া উচিত।
check_drink? মেথডটি ইমপ্লিমেন্ট করুন, যা drink আর্গুমেন্ট নেয়, যেখানে পানীয়ের নাম একটি String হিসেবে থাকে।
পানীয়ে বিষ না থাকলে মেথডটি সেই পানীয় রিটার্ন করবে, অন্যথায় এটি nil রিটার্ন করবে।
CastleDinner.check_drink?("Apple juice")
# => "Apple juice"
CastleDinner.check_drink?("Tea")
# => nil
মহারানি চাইবেন না তাঁর অতিথিরা খাবারে বিষ নিয়ে চিন্তিত হোক। তাই পানীয়ে বিষ থাকলে তার বদলে নতুন একটি পানীয় দেওয়া উচিত, আর সেটি হবে Apple juice।
replace_drink মেথডটি ইমপ্লিমেন্ট করুন, যা drink আর্গুমেন্ট নেয়, যেখানে পানীয়ের নাম একটি String হিসেবে থাকে।
পানীয়ে বিষ না থাকলে মেথডটি সেই পানীয় রিটার্ন করবে, অন্যথায় এটি "Apple juice" রিটার্ন করবে।
CastleDinner.replace_drink("Orange juice")
# => "Orange juice"
CastleDinner.replace_drink("Tea")
# => "Apple juice"
Exercism-এ সাইন আপ করুন, Crystal ট্র্যাকের 26টি কনসেপ্ট142টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।