রুবিতে এই defined? কিওয়ার্ড আছে যা আপনাকে চেক করতে সাহায্য করে যে একটি ভেরিয়েবল ডিফাইন করা আছে কিনা।
যদি ভেরিয়েবলটি একজিস্ট করে তবে আপনি এর টাইপ পাবেন:
apple = 1 defined?(apple) # "local-variable"
যদি না থাকে তবে আপনি nil পাবেন:
defined?(bacon) # nil
এটি জাভাস্ক্রিপ্টের typeof অপারেটরের মতো। আপনি যদি একটি অবজেক্টের ক্লাস জানতে চান তবে এই 키ওয়ার্ডের পরিবর্তে class মেথড ব্যবহার করুন।
কয়েকটি দিলচস্প পয়েন্ট:
defined?একটি কিওয়ার্ড, মেথড নয়defined?রুবিতে những قليلًا জিনিসপত্রের মধ্যে এক যা প্রশ্নবোধক চিহ্ন দিয়ে শেষ হয়, কিন্তু সাধারণ কনভেনশন ফলো করে নাtrueবাfalseরিটার্ন করার জন্যdefined?একটি nil মান এবং একটি ভেরিয়েবল যা কখনো সেট করা হয়নি তার মধ্যে পার্থক্য করতে পারে
এই বিশেষ বৈশিষ্ট্যগুলো এই কিওয়ার্ডটিকে শিখতে যোগ্য করে তোলে।
ডিফাইন করা ভেরিয়েবল চেক করার একটি ভালো উপায়
এই কিওয়ার্ডটি উপকারী হতে পারে, কিন্তু এর কিছু সমস্যা আছে।
কেন?
তার কম অপারেটর প্রেসিডেন্স কারণে।
আপনি যদি এভাবে করেন:
defined? orange && orange.size
ফলাফল হবে "expression"।
কারণ orange && orange.size কে defined?-এর আর্গুমেন্ট হিসেবে ইন্টারপ্রেট করা হয়।
সঠিক উপায় হবে:
defined?(orange) && orange.size
রুবিতে ভেরিয়েবল ডিফাইন করা আছে কিনা চেক করার অন্যান্য উপায়ও আছে।
লোকাল ভেরিয়েবলের জন্য:
local_variables.include?(:orange)
ইনস্ট্যান্স ভেরিয়েবলের জন্য:
instance_variable_defined?("@food")
কিন্তু আপনি এগুলোর কোনটিই ব্যবহার করতে চাইবেন না।
৯৯% কেসে, যদি একটি লোকাল ভেরিয়েবল অনুপস্থিত থাকে তবে আপনার টাইপো আছে বা কেউ সেটি ডিক্লেয়ার করতে ভুলে গেছে।
ইনস্ট্যান্স ভেরিয়েবলের কী?
অনডিফাইনড ইনস্ট্যান্স ভেরিয়েবল সবসময় nil, তাই আপনি সেটি চেক করতে চান।
"সেফ নেভিগেটর অপারেটর" (রুবি ২.৩+) ট্রাই করুন যা শুধু মেথড কল করে যদি ভেরিয়েবল nil না হয়।
উদাহরণ:
if @user&.country == "Spain" # ... end
এটি এর সমতুল্য:
if @user && @user.country == "Spain" # ... end
এইগুলো defined? কিওয়ার্ড униভার্সাল নয়, কিন্তু এগুলো আরও প্রেডিক্টেবল এবং এরর-প্রোন কম।
মেথড ডিফাইন আছে কিনা চেক করুন
আপনি defined? দিয়ে চেক করতে পারেন যে একটি মেথড ডিফাইন আছে কিনা, কিন্তু এটি সেটাই প্র্যাক্টিক্যাল নয়।
উদাহরণ:
defined?(puts) # "method"
কারণ এটি একটি কিওয়ার্ড, মেথড নয় তাই আপনি এটি একটি অবজেক্টের সাথে ব্যবহার করতে পারবেন না।
আমি কী বোঝাতে চাচ্ছি:
[].defined?(:size) # undefined method `defined?' for []:Array
আপনি খুঁজছেন respond_to? মেথডটি।
এখানে কীভাবে ব্যবহার করবেন:
[].respond_to?(:size) # true [].respond_to?(:orange) # false
ক্লাস একজিস্ট করে কিনা চেক করুন
উদাহরণ:
defined?(Object) # "constant" defined?(A) # nil
একটি ভালো অপশন হলো const_defined? মেথড ব্যবহার করা।
এভাবেই:
Object.const_defined?(:String) # true Object.const_defined?(:A) # false
সারসংক্ষেপ
এi, আপনি একটি সহজ উপায় শিখলেন যেকোনো ভেরিয়েবল, ক্লাস বা মেথড একজিস্ট করে কিনা চেক করার জন্য!
ভেরিয়েবলের সাথে কাজ করার সময় আপনি অধিকাংশ সময় nil চেক করতে চান, ভেরিয়েবল ডিফাইন আছে কিনা সেটি না। বা আরও ভালো, কনভারশন মেথড দিয়ে ভেরিয়েবলকে একটি পরিচিত ক্লাসে কনভার্ট করুন।
আশা করি আপনি এই আর্টিকেলটি উপকারী পেয়েছেন! যদি পেয়ে থাকেন তবে দয়া করে শেয়ার করুন যাতে আরও মানুষ উপকৃত হতে পারে।