নিল...
আসলেই এটি কী?
তবে, nil হলো একটি বিশেষ রুবি অবজেক্ট যা "খালি" বা "ডিফল্ট" ভ্যালু রিপ্রেজেন্ট করতে ব্যবহৃত হয়। এটি একটি "ফলসি" ভ্যালুও, অর্থাৎ কন্ডিশনাল স্টেটমেন্টে ব্যবহৃত হলে এটি false-এর মতো আচরণ করে।
এখন:
শুধু একটি nil অবজেক্ট আছে, যার object_id হলো 4 (অথবা ৬৪-বিট রুবিতে 8), এটি nil-কে スペシャル বানানোর অংশ।
nil.object_id # 4
আসুন একটি গভীর নজর দেই!
নিল ভ্যালু কোথা থেকে আসে?
অনেক মেথড ফলাফল হিসেবে nil রিটার্ন করতে পারে।
এটি ঘটে যখন আপনি একটি ভ্যালু চান কিন্তু সেই ভ্যালুটি উপলব্ধ নেই।
উদাহরণ:
- প্রোডাক্ট পাওয়া যায়নি
- অ্যারে ইনডেক্স আউট অফ বাউন্ডস
- হ্যাশ কী অস্তিত্বে নেই
এটি প্রদর্শনের জন্য কিছু কোড:
arr = [1,2,3] arr[5] # nil
এটি প্রায়শই সব ধরনের সমস্যায় লিড করে যেহেতু আমরা আশা করি আমরা যে মেথডটি কল করলাম সেটি একটি বৈধ ভ্যালু রিটার্ন করবে nil-এর বদলে।
যেমন এই NoMethodError এক্সেপশন:
arr[5].size # NoMethodError: undefined method 'size' for nil:NilClass
এই এরর এড়াতে, আপনাকে nil ভ্যালু আছে কিনা চেক করতে হবে তার ওপর মেথড কল করার আগে।
রুবিতে নিল টেস্ট করা
আপনি যদি "undefined method for nil:NilClass" এরর চান না তবে এটি চেষ্টা করুন...
শুধু মেথড কল করুন যদি নিল না হয়:
if array[5] && array[5].size # কিছু করুন... end
এটিই কারণ রুবি ২.৩ "সেইফ নেভিগেটর" অপারেটর (&.) চালু করেছে।
উদাহরণ:
if arr[5]&.size # কিছু করুন... end
নিল টেস্ট করার আরেকটি উপায় হলো nil? মেথড ব্যবহার করা:
if @bacon.nil? # ... end
আরেকটি অপশন হলো blank? মেথড ব্যবহার করা (রেইলস-ওনلی)।
আপনি কোন অবজেক্টের সাথে কাজ করছেন তার উপর নির্ভর করে কিছু টেকনিক আছে जिनका আপনি ব্যবহার করতে পারেন nil চেক সম্পূর্ণ এড়াতে।
উদাহরণস্বরূপ, আপনি হ্যাশ এবং অ্যারে অবজেক্টগুলোর ওপর fetch মেথড ব্যবহার করতে পারেন।
অথবা আপনি আপনার নিজের ক্লাসে "নাল অবজেক্ট প্যাটার্ন" ব্যবহার করতে পারেন যদি আপনি nil-এর বদলে একটি ডিফল্ট ভ্যালু রিটার্ন করতে চান।
অন্য জায়গা যেখানে নিল লুকিয়ে থাকে
আপনাকে জানতে হবে যে অনডিফাইনড ইনস্ট্যান্স ভেরিয়েবল nil রিটার্ন করে।
@foo # nil
তাই এর জন্য সতর্ক থাকুন, এটা হতে পারে আপনি আপনার ইনস্ট্যান্স ভেরিয়েবলের নাম ভুল লিখেছেন অথবা আপনি এটি ইনিশিয়ালাইজ করতে ভুলে গেছেন!
এক আর জায়গা যেখানে আপনি nil পেতে পারেন সেটি হলো puts এবং print মেথডের সাথে।
এই দুটি মেথড সবসময় nil রিটার্ন করে।
আমি এটিকে মেনশন করছি কারণ আমার কিছু ছাত্রকে আমি দেখেছি এমন কিছু ট্রাই করার চেষ্টা করতে:
numbers = [1,2,3].map { |n| puts n * 2 }
ফলাফল numbers হয়ে যায় [nil, nil, nil]। এই কেসে সমাধান হলো ব্লকের ভেতর থেকে puts সরিয়ে ফেলা।
NilClass বুঝা
যেকোনো অন্য রুবি অবজেক্টের মতো nil-এর একটি মেথড সেট আছে।
রুবিনাস থেকে ক্লাস ডেফিনিশন:
class NilClass
def to_s; ""; end
def inspect; "nil"; end
def nil?; true; end
def to_a; []; end
def to_f; 0.0; end
def to_i; 0; end
def to_c; Complex(0); end
def to_h; {}; end
end
লক্ষ্য করুন কীভাবে সব এই to_something মেথডগুলো একটি খালি ভ্যালু রিটার্ন করে (0 নাম্বারের জন্য)।
খালি হ্যাশ, খালি স্ট্রিং, খালি অ্যারে...
এটির কারণ হলো nil "কিছু নেই" রিপ্রেজেন্ট করতে ব্যবহৃত হয়।
নাল অবজেক্ট প্যাটার্ন
nil সম্পর্কে কোনো আলোচনা নাল অবজেক্ট প্যাটার্নের উল্লেখ ছাড়া সম্পূর্ণ হয় না।
তাঁর চমৎকার টক, "Nothing is Something"-এ, স্যান্ডি মেটজ বোঝানว่า nil যদি "কিছু নেই" মানে করে তবে এর একটি আরও নির্দিষ্ট অর্থ থাকতে পারে।
উদাহরণস্বরূপ, আমরা একটি মেথড লিখি যা প্রোডাক্ট খুঁজে বের করে এবং আমরা একটি ডিফল্ট প্রোডাক্ট রিটার্ন করতে চাই...
আমরা একটি নাল প্রোডাক্ট এইভাবে রিটার্ন করতে পারি:
class MissingProduct
def name
"Product not found"
end
end
এখন যদি আমাদের একটি অ্যারে থাকে আসল প্রোডাক্ট অবজেক্ট এবং নাল প্রোডাক্টের মিশ্রণে তবে এই সব প্রোডাক্টের name মেথড থাকবে। এর মানে আপনি NoMethodError এক্সেপশন পাবেন না।
টিপ: যদি আপনি আপনার সব অবজেক্টকে একইভাবে ট्रीট করতে পারেন, অবজেক্ট টাইপ চেক করা ছাড়া তবে আপনি পলিমরফিজমের সুবিধা নিচ্ছেন।
এই ধরনের অবজেক্টগুলো আপনার প্রেজেন্টেশন লেয়ারের জন্য দুর্দান্ত, কিন্তু আপনার কন্ট্রোলারের জন্য ততটুকু নয় যেখানে আপনি কিছু ভিন্ন করতে চান যদি আপনি যা খুঁজছেন সেটি উপলব্ধ না হয়, যেমন এলার্ট মেসেজ, রিডাইরেক্ট, ইত্যাদি।
Truthy/Falsy
nil-এর সম্পর্কে আপনার জানা দরকার আরেকটি বিষয় হলো এটি একমাত্র ভ্যালু, false ছাড়া (যা একটি অবজেক্টও), যেটি "ফলসি" মনে করা হয়।
রুবিতে বাকি সব কিছু একটি বুলিয়ান কন্টেক্সটে true মনে করা হয়।
কিছু ল্যাঙ্গুয়েজ নাম্বার 0-কে false ভ্যালু মনে করে, কিন্তু রুবিতে সেটি সত্য নয়:
if 0 puts 123 end # 123
এটি বলছে: "যদি 0 হলো true তবে 123 প্রিন্ট করো"।
ভিডিও
সারসংক্ষেপ
আপনি শিখতে পেরেছেন যে nil শুধু একটি রুবি অবজেক্ট যা "কিছু নেই" রিপ্রেজেন্ট করে।
আপনি এছাড়া শিখতে পেরেছেন যে nil এবং false রুবিতে একমাত্র দুটি জিনিস যেগুলো "ফলসি"। বাকি সব কিছু "ট্রুথি"।
যদি আপনি এই পোস্টটি উপভোগ করেছেন তবে আপনার প্রিয় সোশ্যাল নেটওয়ার্কে শেয়ার করা ভুলবেন না!