রুবি এবং রেইলসের কিছু মেথড আছে যা একটি ভ্যালুর অস্তিত্ব বা একটি অবজেক্টের স্টেট চেক করতে ব্যবহার করা যায়। রুবি প্রদান করে #nil? এবং #empty?, এবং রেইলস' ActiveSupport যোগ করে #blank? এবং #present?। সবগুলো নিজস্ব ভাবেই কাজ করে এবং প্রতিটি কীভাবে ডেটা ইভ্যালুয়েট করে সেটা জানা গুরুত্বপূর্ণ কারণ আপনার কোডে ভুল মেথড ব্যবহার করলে অপ্রত্যাশিত ফলাফল হতে পারে।
এই আর্টিকেলে, আমরা এই মেথডগুলোর ওপর আপনার জ্ঞান তাজা করব। আমরা (পুনরা) শিখব প্রতিটি ব্যবহার করলে কোন কন্ডিশন পাস বা ফেইল করে সেইসাথে প্রতিটি মেথড কোন টাইপের অবজেক্টে ব্যবহার করা যায়। আমরা শেষে একটি হ্যান্ডি চিট শিটও দেব!
#nil?
#nil? হলো Object ক্লাসের একটি রুবি মেথড। যেহেতু সব ক্লাস এই ক্লাস থেকে ইনহেরিট করে, #nil? যেকোনো অবজেক্টে ব্যবহার করা যায়। এটি nil ( NilClass ক্লাসের একটি ইনস্ট্যান্স) এর জন্য true রিটার্ন করে এবং বাকি সবকিছুর জন্য false।
nil.nil? # => true
true.nil? # => false
5.nil? # => false
"".nil? # => false
[].nil? # => false
#empty?
#empty? হলো একটি মেথড যা স্ট্রিং, অ্যারে, হ্যাশ এবং সেটে ব্যবহার করা যায়। এটি true রিটার্ন করে যদি অবজেক্টের ইনস্ট্যান্সের লেন্থ শূন্য হয়।
স্ট্রিংসে ব্যবহার করলে, এটি খালি স্ট্রিং-এর জন্য true রিটার্ন করে।
"".empty? # => true
মনে রাখবেন হোয়াইটস্পেস ক্যারেক্টেরও ক্যারেক্টার, তাই শুধু হোয়াইটস্পেস ধারণকারী স্ট্রিংয়ে #empty? ব্যবহার করলে false রিটার্ন করবে। এইজন্য, এটি টেক্সট ভ্যালিডেশনের জন্য সেরা মেথড নাও হতে পারে। যদি আপনি শুধু এই মেথড ব্যবহার করে ইউজার ইনপুট ভ্যালিডেট করেন, তবে আপনি শুধু হোয়াইটস্পেস ধারণকারী ইনপুট প্রসেস করতে পারেন।
" ".empty? # => false
"\t\n".empty? # => false
অ্যারে, হ্যাশ এবং সেটের জন্য, এটি true রিটার্ন করে যদি তাদের কোনো এলিমেন্ট না থাকে।
[].empty? # => true
{}.empty? # => true
require 'set'
Set.new.empty? # => true
যখন #empty? nil বা অন্য যেকোনো ক্লাসে ব্যবহার করা হয় যাতে মেথডটি নেই, একটি NoMethodError এক্সেপশন রেইজ হবে। তাই আপনার ডেটা চেক করার জন্য এটি ব্যবহার করতে হলে, আপনাকে আরও চেক বসাতে হবে যাতে আপনার প্রোগ্রাম কখনো ক্র্যাশ না করে।
if !my_var.nil? && !my_var.empty?
# my_var ব্যবহার করুন
end
একটি ভালো মেথড হবে রেইলসের #blank? মেথড, যা আমরা এখন দেখব।
#blank?
#blank? হলো একটি রেইলস মেথড (ActiveSupport-এ)। এটি যেকোনো অবজেক্টে অপারেট করে।
স্ট্রিংসের জন্য, এটি খালি স্ট্রিং এবং শুধু হোয়াইটস্পেস ক্যারেক্টার ধারণকারী স্ট্রিং উভয়ের জন্য true রিটার্ন করে।
"".blank? # => true
" ".blank? # => true
"\n\t".blank? # => true
অ্যারে, হ্যাশ এবং সেটের জন্য, এটি #empty?-এর মতই কাজ করে, অর্থাৎ কোনো এলিমেন্ট না থাকলে true রিটার্ন করে।
[].blank? # => true
{}.blank? # => true
Set.new.blank? # => true
[nil].blank? # => false
["", ""].blank? # => false
person = {:firstName => "John", :lastName => "Doe"}
person.blank? # => false
এটি true এর জন্য false এবং যেকোনো ফолসি কন্ডিশন (অর্থাৎ nil এবং false) এর জন্য true রিটার্ন করে।
true.blank? # => false
false.blank? # => true
nil.blank? # => true
আপনি দেখতে পাচ্ছেন, ডেটা ভ্যালিডেশনের জন্য #empty?-র চেয়ে #blank? ব্যবহার করা ভালো কারণ এটি কিছু অবজেক্টে ব্যবহার করলে NoMethodError করবে না যেহেতু এটি সব অবজেক্টের জন্য উপলব্ধ। এছাড়া শুধু হোয়াইটস্পেস ধারণকারী স্ট্রিংয়ের জন্য পাস করবে না।
#present?
#present? ও একটি রেইলস মেথড। এটি #blank?-এর ঠিক বিপরীত কাজ করে।
!my_var.blank? == my_var.present? # => true
এখানে কিছু উদাহরণ:
"".present? # => false
" ".present? # => false
[].present? # => false
nil.present? # => false
true.present? # => true
false.present? # => false
{}.present? # => false
person = {:firstName => "John", :lastName => "Doe"}
person.present? # => true
5.present? # => true
এটিও #empty?-র চেয়ে ভ্যালিডেশনের জন্য ভালো মেথড, उन्हीं কারণগুলোর জন্য যা #blank?-এর জন্য কভার করা হয়েছিল।
উপসংহার
যেহেতু এই মেথডগুলোর নামকরণ বিভ্রান্তিকর, এখানে আপনার জন্য একটি হ্যান্ডি চিট শিট যা আপনি বুকমার্ক করতে পারেন।
#nil? | #empty? | #blank? | #present? | |
|---|---|---|---|---|
5 | false | NoMethodError | false | true |
"" | false | true | true | false |
" " | false | false | true | false |
"\t\n" | false | false | true | false |
[] | false | true | true | false |
["a"] | false | false | false | true |
{} | false | true | true | false |
{a: "b"} | false | false | false | true |
Set.new | false | true | true | false |
nil | true | NoMethodError | true | false |
true | false | NoMethodError | false | true |
false | false | NoMethodError | true | false |
সবকিছুর মত, #nil?, #empty?, #blank? এবং #present? এর মধ্যে চয়ন পরিস্থিতির ওপর নির্ভর করে। উদাহরণস্বরূপ, চেক করতে একজন ইউজারের আড্রেস করার জন্য নাম আছে কিনা, #present? একটি ভালো ফিট হতে পারে। তবে #blank? এবং #present সব অবজেক্টের জন্য বুলিয়ান রিটার্ন করে, যা কোডে বাগ লুকিয়ে রাখতে পারে এরর না রেইজ করে যখন একটি মান ভুল টাইপের।
আমরা আশা করি রুবিতে ভ্যালু চেক করার ওপর আপনার মেমরি তাজা করলাম। আপনার কোনো প্রশ্ন বা মন্তব্য থাকলে, @AppSignal-এ আমাদের লাইন ড্রপ করতে সংকোচ করবেন না।