Blocks রুবি ভাষায় একটি শক্তিশালী ফিচার, যা কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বৃদ্ধি করতে ব্যবহৃত হয়। ব্লকগুলো একটি ফাংশনের ভিতরে কোডের একটি সেগমেন্ট হিসেবে কাজ করে, এবং একাধিক আর্গুমেন্ট গ্রহণ করতে পারে। ব্লকগুলো সাধারণত মেথডের আর্গুমেন্ট হিসেবে ব্যবহৃত হয়, এবং do...end বা {...} এর মধ্যে কোড লেখা হয়।
১. Blocks এর ধারণা
রুবিতে, Block হল একটি কোড সেগমেন্ট, যা মেথড কলের সময় আর্গুমেন্ট হিসেবে পাস করা হয়। এটি কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকরীতা বাড়াতে ব্যবহৃত হয়। ব্লক সাধারণত মেথডের সাথে যুক্ত হয়ে একটি নির্দিষ্ট কাজ সম্পন্ন করে। ব্লকগুলো মেথডের ভিতরে yield দ্বারা কল করা হয়, যা ব্লকের মধ্যে কোড কার্যকর করে।
ব্লক এবং মেথড
যখন একটি মেথড একটি ব্লক পাস নেয়, তখন মেথডের ভিতরে yield কমান্ডের মাধ্যমে ব্লকটি কার্যকর করা হয়।
২. Syntax
ব্লকটি do...end বা {...} এর মধ্যে লিখা যেতে পারে। দুটি স্টাইলের মধ্যে পার্থক্য হলো, {} সাধারণত একলাইনে ব্যবহৃত হয় এবং do...end একাধিক লাইনে ব্যবহৃত হয়।
উদাহরণ ১: do...end ব্লক
def greet
yield # yield কমান্ড ব্লককে কল করবে
end
greet { puts "Hello, World!" } # ব্লক পাস করা হচ্ছে
# আউটপুট:
# Hello, World!উদাহরণ ২: {...} ব্লক
def greet
yield
end
greet { puts "Hi there!" }
# আউটপুট:
# Hi there!এখানে, ব্লকটি greet মেথডের কলের সময় পাস করা হয়েছে এবং yield কমান্ডের মাধ্যমে ব্লকটি কার্যকর করা হয়েছে।
৩. ব্লকের আর্গুমেন্টস
ব্লকগুলির মধ্যে আর্গুমেন্টও পাস করা যেতে পারে, যা মেথডের মাধ্যমে yield কমান্ডে পাঠানো হয়।
উদাহরণ:
def square_numbers
yield(4) # ব্লকে পাস করা আর্গুমেন্ট
yield(6)
end
square_numbers { |num| puts num ** 2 } # ব্লক আর্গুমেন্ট
# আউটপুট:
# 16
# 36এখানে, yield ব্লকের মধ্যে num প্যারামিটার পাস করে, এবং ব্লকটি সেই প্যারামিটার গ্রহণ করে মানটি স্কয়ার করে আউটপুট দেখায়।
৪. ব্লক এবং মেথডের আর্গুমেন্ট
মেথডের আর্গুমেন্ট এবং ব্লকের মধ্যে একটি সম্পর্ক রয়েছে। মেথডে আর্গুমেন্ট পাস করার সময় আপনি ব্লকের মাধ্যমে সেই আর্গুমেন্ট গ্রহণ করতে পারেন। এইভাবে, ব্লকটি মেথডের আর্গুমেন্ট হিসেবেও কাজ করতে পারে।
উদাহরণ:
def multiply(a, b)
yield(a, b) # ব্লক আর্গুমেন্ট পাস করা হচ্ছে
end
multiply(3, 4) { |x, y| puts x * y } # ব্লক ব্যবহার করা হচ্ছে
# আউটপুট:
# 12এখানে, multiply মেথড দুটি আর্গুমেন্ট পাস করেছে এবং ব্লকটি তাদের গ্রহণ করে গুণফল দেখাচ্ছে।
৫. Blocks with Return (ব্লক সহ রিটার্ন)
রুবিতে, যখন একটি ব্লক return কমান্ড ব্যবহার করে কোনো মান ফিরিয়ে দেয়, তখন সেটি মূল মেথডের executionকে প্রভাবিত করে। তবে, এটি ব্লকের বাইরে চলে যাওয়ার জন্য নয়, শুধুমাত্র ব্লক ফাংশনের ভিতরে প্রভাবিত হয়।
উদাহরণ:
def test_block
return "Returning from method" if yield # yield দ্বারা ব্লক চেক করা হচ্ছে
"No return from block"
end
puts test_block { 5 > 3 } # আউটপুট হবে "Returning from method"এখানে, ব্লকটি yield কমান্ডের মাধ্যমে কার্যকর করা হয় এবং এর শর্ত সত্য হলে মেথডটি তৎক্ষণাৎ রিটার্ন হয়ে যায়।
৬. Proc এবং Lambda vs Block
ব্লকটি একটি বিশেষ ধরনের অবজেক্ট যেটি কোডের পুনঃব্যবহারযোগ্য অংশ হিসেবে কাজ করে, তবে রুবিতে Proc এবং Lambda নামের দুটি আলাদা অবজেক্ট রয়েছে, যেগুলি ব্লকের মতো আচরণ করে তবে তাদের কিছু পার্থক্য আছে।
- Proc: ব্লক এবং মেথডের মধ্যে কোড সংরক্ষণের জন্য ব্যবহার করা হয়।
- Lambda: এটি একটি Proc এর মতো, তবে এটি কিছু নির্দিষ্ট নিয়ম মেনে কাজ করে, যেমন আর্গুমেন্ট সংখ্যা যাচাই করা।
সারসংক্ষেপ
- Blocks রুবি প্রোগ্রামিং ভাষায় কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বৃদ্ধির জন্য ব্যবহৃত হয়।
- ব্লক সাধারণত মেথডের আর্গুমেন্ট হিসেবে ব্যবহৃত হয় এবং
do...endবা{...}এর মধ্যে কোড লিখা হয়। - ব্লক সাধারণত
yieldকমান্ড দ্বারা কার্যকর করা হয়, যা ব্লকটির মধ্যে কোড এক্সিকিউট করে। - ব্লক আর্গুমেন্টও গ্রহণ করতে পারে, যা মেথডের মাধ্যমে পাঠানো হয়।
এটি রুবি প্রোগ্রামিং ভাষায় একটি শক্তিশালী এবং নমনীয় ফিচার, যা কোডের কার্যকারিতা এবং মডুলারিটি উন্নত করে।
Read more