আমি রুবি কোডের একটি অংশ সম্পর্কে এক বন্ধুর সাথে চ্যাট করছিলাম এবং রিটার্ন মানগুলির বিষয় এসেছে...
…এবং অবশ্যই, nil
সবসময় সেই কথোপকথনের অংশ।
সেই দিন পরে, আমি বিছানায় ঘুমাতে যাচ্ছিলাম, ভাবছিলাম, আমরা কেন nil
ব্যবহার করি ?
আমি ভেবেছিলাম পরের দিন এটি সম্পর্কে লিখতে একটি ভাল ধারণা হবে, এবং আমি এখানে আছি। আমি আশা করি আপনি এটি আকর্ষণীয় এবং নতুন কিছু শিখুন!
অন রিটার্ন মান এবং প্রত্যাশিত আচরণ
যখন আপনি select
এর মত একটি পদ্ধতি কল করুন আপনি সর্বদা একটি অ্যারে পেতে যাচ্ছেন৷
নির্বাচন করার মতো কিছু না থাকলেও।
উদাহরণ :
[1,2,3].select {} # [] [1,2,3].select(&:even?) # [2]
কিন্তু কেন এটা গুরুত্বপূর্ণ?
ভাল প্রশ্ন!
আপনি যদি সর্বদা একটি অ্যারে পান তবে আপনি অ্যারে পদ্ধতিতে কল করতে পারেন (size
, empty?
, push
…) আপনি আসলে একটি অ্যারের সাথে কাজ করছেন কিনা তা পরীক্ষা না করেই৷ .
এটি একটি ভাল জিনিস কারণ ক্লাস চেকিং উচ্চ সংযোগের দিকে পরিচালিত করে।
আপনি যদি আরও নমনীয় কোড লিখতে চান তাহলে "এটি কোন ক্লাস" এর জন্য পরীক্ষা করা এড়িয়ে চলুন যতটা সম্ভব।
একক মান ফিরিয়ে দেওয়া
ঠিক আছে, কিন্তু find
এর মত একটি পদ্ধতি ব্যবহার করলে কি হবে , যা শুধুমাত্র একটি মান প্রদান করে?
যদি উপাদানটি পাওয়া যায় তবে এটি কাজ করে:
[1,2,3].find { |n| n == 2 } # 2
কোন মিল না থাকলে, find
কিছু ফেরত দিতে হবে, এটি false
ফেরত দিতে পারে , কিন্তু যদি আমরা এই রিটার্ন মানের উপর একটি পদ্ধতি কল করার আশা করি তবে আমরা একটি ব্যতিক্রম পেতে যাচ্ছি।
এখানে nil
আছে আসে, আমরা এটি ব্যবহার করি কারণ এটিই সবচেয়ে কাছের জিনিস যা আমরা একটি জেনেরিক নাল অবজেক্টে পেতে পারি।
আপনার মনে হতে পারে nil এর উপর আমার শেষ নিবন্ধ থেকে, আমি আপনাকে দেখিয়েছি কিভাবে nil
to_i
এর মত পদ্ধতি সহ একটি ক্লাস , to_s
&to_a
.
এটি আপনাকে Array()
এর মত পদ্ধতি ব্যবহার করতে দেয় , এবং String()
একটি বস্তুকে এই ধরণের মধ্যে রূপান্তর করতে।
উদাহরণ :
String(123) # "123" String(nil) # "" Array(nil) # []
এটি স্ট্রিং ইন্টারপোলেশনেও উঠে আসে:
"abc#{nil}dfg"
স্ট্রিং ইন্টারপোলেশন কল to_s
ইন্টারপোলেশন ব্লকের ভিতরে কী আছে তা মূল্যায়নের ফলাফলে। তাই যদি আপনার #{1 + 1}
থাকে এটি 2.to_s
-এ রূপান্তরিত হয় .
এখন সমস্যা nil
সহ আসে যখন আপনি এটি আশা করেন না , আপনি মনে করেন এটি এমন কিছু বস্তু যা foo
-এ সাড়া দেয় পদ্ধতি, কিন্তু এটি নয়, তাই আপনি ভয়ঙ্কর NoMethodError
পান ব্যতিক্রম।
সেই ক্ষেত্রে, আপনি নাল অবজেক্ট প্যাটার্ন বাস্তবায়ন করতে চান, যেমনটি আমি এই নিবন্ধে বর্ণনা করেছি। অন্যান্য সমাধানগুলির মধ্যে রয়েছে fetch
ব্যবহার করা একটি ডিফল্ট মান সহ পদ্ধতি এবং একটি ব্যতিক্রম উত্থাপন যখন একটি ডিফল্ট মান অর্থপূর্ণ হয় না।
সারাংশ
আপনি জেনেছেন কেন আমরা nil
ব্যবহার করি , কিভাবে একটি nil
এ কলিং পদ্ধতি থেকে আসা ব্যতিক্রমগুলি এড়াতে হয় মান, এবং কিভাবে আরো আত্মবিশ্বাসী কোড লিখতে হয়।
আপনার কোডটি দেখুন এবং আপনি কিছু টাইপ-চেকিং কোড খুঁজে পাচ্ছেন কিনা দেখুন৷ (is_a?
/ kind_of?
/ ===
) আপনি আজ যা শিখেছেন তা ব্যবহার করে আপনি কীভাবে সেই কোডটিকে উন্নত করতে পারেন?