Procs এবং Lambdas উভয়ই রুবি প্রোগ্রামিং ভাষায় ফাংশনাল প্রোগ্রামিংয়ের অংশ হিসেবে ব্যবহৃত হয়, এবং এগুলোর মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বৃদ্ধি করা যায়। তবে, Procs এবং Lambdas এর মধ্যে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে, যা তাদের ব্যবহার এবং আচরণকে পৃথক করে।
১. Syntax এবং Definition
Proc (প্রক)
Proc হল একটি অবজেক্ট, যা রুবির মধ্যে ফাংশন হিসেবে কাজ করে। এটি সাধারণত Proc.new অথবা proc কিওয়ার্ড দিয়ে তৈরি করা হয়। প্রোক্স একটি কোড ব্লক ধারণ করে, এবং এটি মেথডে পাস করা যায়।
# Creating a Proc using Proc.new
my_proc = Proc.new { |x| puts "Hello, #{x}" }
# OR Creating a Proc using proc shorthand
my_proc = proc { |x| puts "Hello, #{x}" }Lambda (ল্যাম্বডা)
Lambda হল একটি বিশেষ ধরনের Proc, যা নির্দিষ্ট কিছু নিয়ম অনুযায়ী কাজ করে। এটি সাধারণত lambda কিওয়ার্ড দিয়ে তৈরি করা হয়। ল্যাম্বডা এমন একটি ব্লক যা ফাংশন হিসেবে কাজ করে এবং এটি ফাংশনের মতো আচরণ করে।
# Creating a Lambda
my_lambda = lambda { |x| puts "Hello, #{x}" }
# OR Creating a Lambda using -> shorthand
my_lambda = ->(x) { puts "Hello, #{x}" }২. Parameters Handling
Proc
Proc এর জন্য প্যারামিটার ব্যবহারের ক্ষেত্রে একটি গুরুত্বপূর্ণ পার্থক্য হল, এটি অপ্রত্যাশিত প্যারামিটার গ্রহণ করতে পারে। এটি যদি প্রাপ্ত প্যারামিটার দিয়ে কোনো কোড না চলে, তবে এটি কোনো ত্রুটি (error) উৎপন্ন করবে না, বরং nil ফেরত দেবে।
# Proc Example
my_proc = Proc.new { |x, y| puts "Hello, #{x}, #{y}" }
my_proc.call("Alice") # Output: Hello, Alice, এখানে, যেহেতু y প্যারামিটারটি সরবরাহ করা হয়নি, তাই y এর মান nil হবে এবং কোডটি Hello, Alice, nil আউটপুট করবে।
Lambda
Lambda প্যারামিটার চেকিংয়ের ক্ষেত্রে বেশি কড়া। এটি নির্দিষ্ট প্যারামিটার সংখ্যা চেক করে এবং যদি সেই সংখ্যা পূর্ণ না হয়, তাহলে একটি ArgumentError সৃষ্টি করবে।
# Lambda Example
my_lambda = lambda { |x, y| puts "Hello, #{x}, #{y}" }
my_lambda.call("Alice") # Error: wrong number of arguments (given 1, expected 2)এখানে, ল্যাম্বডা x এবং y দুইটি প্যারামিটার আশা করছে, কিন্তু y প্যারামিটারটি সরবরাহ না করা হলে একটি ত্রুটি ঘটবে।
৩. Return Behavior
Proc
Proc যখন একটি return কমান্ড ব্যবহার করে, তখন এটি মেথডের মধ্যে return কমান্ডটিকে প্রভাবিত করতে পারে। এটি outer method বা প্রেক্ষিতের মধ্যে রিটার্ন নিয়ে যেতে পারে, যা কোডের 흐ামান্বয়কে বন্ধ করে দেয়।
def my_method
my_proc = Proc.new { return "Returning from Proc!" }
my_proc.call
puts "This will never be printed."
end
puts my_method # Output: Returning from Proc!এখানে, my_proc.call এর মাধ্যমে return কমান্ড মেথডের বাইরে চলে গেছে এবং "This will never be printed." কখনোই মুদ্রিত হয়নি।
Lambda
Lambda একটি সাধারণ ফাংশনের মতো আচরণ করে এবং এটি ফাংশন স্কোপ রিটার্ন করে। return কমান্ড lambda এর নিজস্ব স্কোপে কাজ করে এবং বাহ্যিক মেথডের কার্যক্রম প্রভাবিত করে না।
def my_method
my_lambda = lambda { return "Returning from Lambda!" }
my_lambda.call
puts "This will be printed."
end
puts my_method # Output: This will be printed.এখানে, ল্যাম্বডা ফাংশনের মধ্যে return কমান্ড ব্যবহার করা হয়েছে, কিন্তু এটি শুধুমাত্র ল্যাম্বডার স্কোপে কাজ করেছে, বাহ্যিক মেথডে কোনো প্রভাব ফেলেনি।
৪. Performance
এটি বলে দেওয়া যেতে পারে যে, Lambdas সাধারণত Procs থেকে একটু বেশি কার্যকরী (performant), কারণ Lambdas ফাংশনের মতো আচরণ করে এবং এটি প্যারামিটার চেকিং করে, যা একটি নিয়ন্ত্রিত পরিবেশে দ্রুত কাজ করে। অন্যদিকে, Procs কিছুটা নমনীয় এবং এটি প্যারামিটার চেকিং কম করে।
5. Summary of Differences
| Feature | Proc | Lambda |
|---|---|---|
| Parameters | Flexible parameter handling, can ignore extra parameters | Strict parameter handling, raises error for missing parameters |
| Return Behavior | Returns from the enclosing method | Returns from only the lambda itself |
| Creation Syntax | Proc.new {} or proc {} | lambda {} or -> |
| Use case | Used for more flexible function-like behavior | Used for more structured, function-like behavior |
| Performance | Generally slower due to flexibility | Generally faster, stricter with parameters |
Conclusion
- Procs: একাধিক প্যারামিটার গ্রহণ করতে পারে এবং তার প্যারামিটার চেকিং খুবই নমনীয়।
returnকমান্ড ব্যবহার করলে এটি বাহ্যিক মেথডকে প্রভাবিত করে। - Lambdas: সঠিক প্যারামিটার চেকিং করে এবং একটি সাধারণ ফাংশনের মতো আচরণ করে, যেখানে
returnশুধুমাত্র ল্যাম্বডার স্কোপে কাজ করে।
Lambdas তখন ব্যবহার করা উচিত যখন আপনি প্যারামিটার চেকিং এবং একটি নির্দিষ্ট স্কোপে ফাংশনাল আচরণ চান, এবং Procs তখন ব্যবহার করা উচিত যখন কোডের পুনঃব্যবহারযোগ্যতা এবং নমনীয়তা চাচ্ছেন।
Read more