রুবি একটি অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং ভাষা, যেখানে মেথড এবং ব্লক ব্যবহার করা হয় কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যক্ষমতা বাড়ানোর জন্য। রুবির মেথড এবং ব্লক দুটি গুরুত্বপূর্ণ ধারণা, যা কোডের কার্যক্রম পরিচালনা করে। এখানে আমরা মেথড এবং ব্লকের মধ্যে পার্থক্য এবং তাদের ব্যবহারের বিস্তারিত আলোচনা করব।
১. Methods (মেথড)
মেথড হলো রুবিতে একটি ব্লক কোড যা এক বা একাধিক কাজ সম্পাদন করার জন্য ব্যবহৃত হয়। মেথড তৈরি করে, আপনি কোডের পুনঃব্যবহারযোগ্যতা বাড়াতে পারেন এবং একই কাজ বারবার করার প্রয়োজনীয়তা কমাতে পারেন।
মেথড ডিফাইন করা (Defining a Method)
রুবিতে একটি মেথড ডিফাইন করার জন্য def কিওয়ার্ড ব্যবহার করা হয়।
def greet(name)
return "Hello, #{name}!"
end
puts greet("আজিজ")এখানে greet একটি মেথড, যা একটি আর্গুমেন্ট নেয় (যেমন name) এবং একটি স্ট্রিং রিটার্ন করে।
মেথডে আর্গুমেন্ট পাস করা (Passing Arguments to a Method)
রুবি মেথডে আর্গুমেন্ট পাস করতে সক্ষম। এই আর্গুমেন্ট মেথডের ভিতরে ব্যবহৃত হতে পারে।
def sum(a, b)
return a + b
end
puts sum(5, 10) # Output: 15এখানে sum মেথড দুটি প্যারামিটার নেয় এবং তাদের যোগফল রিটার্ন করে।
ডিফল্ট আর্গুমেন্ট (Default Arguments)
রুবিতে মেথডে ডিফল্ট আর্গুমেন্টও দেয়া যায়, যদি ব্যবহারকারী কোনো আর্গুমেন্ট না পাস করে।
def greet(name = "Guest")
return "Hello, #{name}!"
end
puts greet("আজিজ") # Output: Hello, আজিজ!
puts greet() # Output: Hello, Guest!এখানে, name আর্গুমেন্টের জন্য একটি ডিফল্ট মান দেওয়া হয়েছে, যা যখন কিছু পাস করা হবে না তখন ব্যবহার হবে।
মেথড রিটার্ন (Return from Method)
রুবি মেথডের ভিতর return কিওয়ার্ড দিয়ে রিটার্ন ভ্যালু ফিরিয়ে দেওয়া হয়।
def square(number)
return number * number
end
puts square(4) # Output: 16এখানে, square মেথড একটি সংখ্যা নেয় এবং তার বর্গফল রিটার্ন করে।
২. Blocks (ব্লক)
ব্লক রুবিতে একটি কোডের অংশ, যা সাধারণত একটি মেথডের ভিতরে পাস করা হয়। ব্লকগুলি কোডের পুনঃব্যবহারযোগ্যতা এবং ফ্লেক্সিবিলিটি উন্নত করতে ব্যবহৃত হয়। ব্লক সাধারণত মেথডের পরামিতি হিসেবে ব্যবহৃত হয়, এবং মেথডের ভিতরে এক্সিকিউট করা হয়।
ব্লক ডিফাইন করা (Defining a Block)
ব্লকগুলি {} বা do...end দিয়ে ডিফাইন করা হয়। ব্লক সাধারণত মেথডের আর্গুমেন্ট হিসেবে পাস করা হয়।
def greet
yield
end
greet { puts "Hello, World!" }এখানে greet মেথডটি একটি ব্লক পাস করিয়েছে, যা yield কিওয়ার্ডের মাধ্যমে এক্সিকিউট হয় এবং "Hello, World!" মেসেজটি প্রিন্ট হয়।
ব্লকে আর্গুমেন্ট পাস করা (Passing Arguments to a Block)
ব্লকটি আর্গুমেন্ট নিতে পারে। যখন আপনি yield ব্যবহার করেন, আপনি একটি আর্গুমেন্টও পাস করতে পারেন।
def greet
yield("আজিজ")
end
greet { |name| puts "Hello, #{name}!" }এখানে, ব্লকটি name আর্গুমেন্ট নেয় এবং "Hello, আজিজ!" মেসেজটি প্রিন্ট করে।
ব্লক এবং মেথডের মধ্যে পার্থক্য
- মেথড: মেথড একটি কোড ব্লক যা একটি নির্দিষ্ট কাজ সম্পাদন করার জন্য তৈরি হয়, এবং এক বা একাধিক আর্গুমেন্ট গ্রহণ করে। মেথড নিজে একটি রিটার্ন ভ্যালু ফিরিয়ে দেয়।
- ব্লক: ব্লক একটি কোডের অংশ যা মেথডে আর্গুমেন্ট হিসেবে পাস করা হয় এবং মেথডের ভিতরে এক্সিকিউট হয়। ব্লক সাধারণত কোনো মান রিটার্ন করে না, তবে এটি মেথডের কাজের অংশ হয়ে থাকে।
ব্লক রিটার্ন (Block Return)
ব্লক থেকে মান ফেরত দেওয়ার জন্য return ব্যবহার করা যায়। তবে এটি শুধু ব্লকটির ভিতরের কাজেই প্রযোজ্য হবে।
def greet
result = yield
puts "Block returned: #{result}"
end
greet { return "Goodbye" }এখানে, ব্লকটি "Goodbye" রিটার্ন করবে এবং সেই মানটি মেথডে পাস হবে।
৩. মেথড এবং ব্লক একসাথে ব্যবহার (Using Methods and Blocks Together)
মেথড এবং ব্লক একসাথে ব্যবহার করা খুবই সাধারণ। আপনি ব্লককে মেথডে পাস করতে পারেন এবং মেথডের মধ্যে yield ব্যবহার করে ব্লকটির কাজ এক্সিকিউট করতে পারেন।
def repeat(n)
n.times { yield }
end
repeat(3) { puts "Hello!" }এখানে, repeat মেথডটি ৩ বার ব্লকটি এক্সিকিউট করবে এবং "Hello!" প্রিন্ট হবে ৩ বার।
সারসংক্ষেপ
রুবির মেথড এবং ব্লক দুটি শক্তিশালী ধারণা, যা কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বাড়ানোর জন্য ব্যবহৃত হয়। মেথড একটি কোড ব্লক যা আর্গুমেন্ট নিয়ে নির্দিষ্ট কাজ সম্পাদন করে এবং একটি রিটার্ন ভ্যালু প্রদান করে। ব্লক সাধারণত মেথডের আর্গুমেন্ট হিসেবে ব্যবহৃত হয় এবং মেথডের ভিতরে এক্সিকিউট হয়। ব্লকগুলি কোডের কার্যক্ষমতা আরও দক্ষ করে এবং কোডের পঠনযোগ্যতা উন্নত করে।
রুবি একটি অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং ভাষা, এবং এতে মেথড (methods) ব্যবহার করে কোডের পুনঃব্যবহারযোগ্য অংশ তৈরি করা হয়। রুবিতে মেথড ডিক্লেয়ার এবং কল করা অত্যন্ত সহজ। মেথড সাধারণত কিছু ইনপুট গ্রহণ করে এবং আউটপুট প্রদান করে। রুবির মেথড ডিক্লারেশন এবং কল করার জন্য কিছু নিয়ম এবং কনভেনশন রয়েছে।
১. Method ডিক্লারেশন (Method Declaration)
রুবিতে মেথড ডিক্লেয়ার করতে def কিওয়ার্ড ব্যবহার করা হয় এবং মেথডটি end দিয়ে শেষ হয়।
সিনট্যাক্স:
def method_name
# code to be executed
endযেখানে:
method_nameহল মেথডের নাম।# code to be executedহল মেথডের মধ্যে যেসব কার্যক্রম চলবে।
উদাহরণ:
def greet
puts "Hello, World!"
endএখানে greet একটি মেথড যা যখন কল করা হবে, তখন এটি "Hello, World!" আউটপুট করবে।
২. Method Parameters (প্যারামিটার)
রুবি মেথডে প্যারামিটার গ্রহণ করতে পারে। প্যারামিটার হল সেই ইনপুট যা মেথড কল করার সময় প্রদান করা হয়।
সিনট্যাক্স:
def method_name(parameter1, parameter2)
# code that uses parameter1 and parameter2
endউদাহরণ:
def greet(name)
puts "Hello, #{name}!"
endএখানে, greet মেথডটি একটি প্যারামিটার name নেয় এবং সেই নামটি আউটপুটে ব্যবহার করে।
৩. Method Call (মেথড কল করা)
রুবি মেথড কল করতে মেথডের নাম এবং প্রয়োজনীয় প্যারামিটার (যদি থাকে) প্রদান করতে হয়।
সিনট্যাক্স:
method_name(arguments)উদাহরণ:
greet("আজিজ") # আউটপুট হবে: "Hello, আজিজ!"এখানে greet("আজিজ") কল করার মাধ্যমে "Hello, আজিজ!" আউটপুট হবে কারণ আমরা name প্যারামিটার হিসাবে "আজিজ" প্রদান করেছি।
৪. Return Statement (রিটার্ন স্টেটমেন্ট)
মেথডে একটি return স্টেটমেন্ট ব্যবহার করা হয় যাতে মেথডের আউটপুট বা ফলাফল রিটার্ন করা যায়। যদি return ব্যবহার না করা হয়, তবে মেথডের শেষ এক্সপ্রেশনটি স্বয়ংক্রিয়ভাবে রিটার্ন হয়ে যায়।
সিনট্যাক্স:
def method_name
return value
endউদাহরণ:
def add(a, b)
return a + b
end
result = add(5, 3)
puts result # আউটপুট হবে: 8এখানে, add মেথড দুটি প্যারামিটার নিয়ে তাদের যোগফল রিটার্ন করছে, এবং আমরা সেই রিটার্ন ভ্যালু result ভেরিয়েবলে সংরক্ষণ করেছি।
৫. Default Parameters (ডিফল্ট প্যারামিটার)
রুবি মেথডে প্যারামিটারগুলির জন্য ডিফল্ট মান নির্ধারণ করা যায়। যদি মেথড কল করার সময় সেই প্যারামিটার প্রদান না করা হয়, তাহলে ডিফল্ট মান ব্যবহার করা হয়।
সিনট্যাক্স:
def method_name(parameter1 = default_value)
# code that uses parameter1
endউদাহরণ:
def greet(name = "Guest")
puts "Hello, #{name}!"
end
greet("আজিজ") # আউটপুট হবে: "Hello, আজিজ!"
greet # আউটপুট হবে: "Hello, Guest!"এখানে, greet মেথডে name প্যারামিটারের জন্য "Guest" একটি ডিফল্ট মান দেওয়া হয়েছে, যদি প্যারামিটার প্রদান না করা হয়।
৬. Method with Multiple Parameters (একাধিক প্যারামিটার)
রুবি মেথডে একাধিক প্যারামিটার ব্যবহার করা যেতে পারে, এবং তারা একসাথে একাধিক ইনপুট গ্রহণ করতে পারে।
সিনট্যাক্স:
def method_name(parameter1, parameter2)
# code that uses parameter1 and parameter2
endউদাহরণ:
def add(a, b)
a + b
end
result = add(5, 7)
puts result # আউটপুট হবে: 12এখানে, add মেথড দুটি প্যারামিটার a এবং b গ্রহণ করে এবং তাদের যোগফল রিটার্ন করে।
সারসংক্ষেপ
- Method Declaration: রুবিতে মেথড ডিক্লেয়ার করতে
defএবংendব্যবহার হয়। - Parameters: মেথডে প্যারামিটার ব্যবহার করে ইনপুট গ্রহণ করা হয়।
- Method Call: মেথড কল করতে মেথডের নাম এবং প্যারামিটার (যদি থাকে) দেয়া হয়।
- Return Statement:
returnস্টেটমেন্ট ব্যবহার করে মেথডের আউটপুট রিটার্ন করা হয়। - Default Parameters: মেথডে প্যারামিটারের জন্য ডিফল্ট মান নির্ধারণ করা যেতে পারে।
রুবিতে মেথডের সাহায্যে কোডকে মডুলার এবং পুনঃব্যবহারযোগ্য করে তোলা সম্ভব।
Methods (মেথড) রুবি প্রোগ্রামিং ভাষায় কোড পুনঃব্যবহারযোগ্য ব্লক হিসেবে ব্যবহৃত হয়। মেথডে arguments (আর্গুমেন্ট) পাস করা হলে, আপনি মেথডের মধ্যে প্রেরিত মানগুলির ভিত্তিতে কার্য সম্পাদন করতে পারেন। রুবিতে আর্গুমেন্ট পাস করা খুবই সহজ এবং বেশ নমনীয়, যা মেথডের মধ্যে ডেটা প্রবাহিত করতে সহায়তা করে।
১. Methods এ আর্গুমেন্ট পাস করা
রুবিতে একটি মেথড তৈরি করার সময় আপনি আর্গুমেন্ট পাস করতে পারেন। এগুলি মেথডে সেই ডেটার মান হিসেবে কাজ করবে যা আপনি মেথডের কল করার সময় প্রদান করবেন।
সাধারণ আর্গুমেন্ট পাস:
def greet(name)
puts "Hello, #{name}!"
end
greet("আজিজ") # আউটপুট: Hello, আজিজ!এখানে, "আজিজ" আর্গুমেন্ট হিসেবে greet মেথডে পাস করা হয়েছে এবং মেথডে এটি name নামক প্যারামিটার হিসেবে গ্রহণ করা হয়েছে।
২. Multiple Arguments (একাধিক আর্গুমেন্ট)
একাধিক আর্গুমেন্ট মেথডে পাস করা খুবই সহজ। আপনি একাধিক আর্গুমেন্ট দিয়ে মেথডকে কল করতে পারেন এবং সেই আর্গুমেন্টগুলিকে প্যারামিটার হিসেবে ব্যবহার করতে পারেন।
উদাহরণ: একাধিক আর্গুমেন্ট
def add(a, b)
return a + b
end
puts add(5, 3) # আউটপুট: 8এখানে, a এবং b দুটি আর্গুমেন্ট মেথডে পাস করা হয়েছে এবং তাদের যোগফল আউটপুট হিসেবে প্রদর্শিত হয়েছে।
৩. Default Arguments (ডিফল্ট আর্গুমেন্ট)
রুবিতে আপনি মেথডে ডিফল্ট আর্গুমেন্ট পাস করতে পারেন, অর্থাৎ যদি আর্গুমেন্ট পাস না করা হয়, তবে একটি পূর্বনির্ধারিত মান ব্যবহৃত হবে।
উদাহরণ: ডিফল্ট আর্গুমেন্ট
def greet(name = "Guest")
puts "Hello, #{name}!"
end
greet("আজিজ") # আউটপুট: Hello, আজিজ!
greet # আউটপুট: Hello, Guest!এখানে, name আর্গুমেন্টে ডিফল্ট মান "Guest" নির্ধারণ করা হয়েছে। যদি greet মেথডে আর্গুমেন্ট না দেওয়া হয়, তবে ডিফল্ট মান ব্যবহার করা হবে।
৪. Variable-Length Arguments (ভেরিয়েবল-লেংথ আর্গুমেন্ট)
রুবি ভেরিয়েবল-লেংথ আর্গুমেন্টের সুবিধা দেয়, যার মাধ্যমে আপনি একটি মেথডে যে কোনও সংখ্যক আর্গুমেন্ট পাস করতে পারেন। এটি * চিহ্ন ব্যবহার করে করা হয়।
উদাহরণ: ভেরিয়েবল-লেংথ আর্গুমেন্ট
def sum(*numbers)
total = 0
numbers.each { |num| total += num }
return total
end
puts sum(1, 2, 3) # আউটপুট: 6
puts sum(4, 5, 6, 7) # আউটপুট: 22এখানে, *numbers দ্বারা মেথডে যে কোন সংখ্যক আর্গুমেন্ট পাস করা যেতে পারে এবং সেগুলিকে একটি অ্যারে হিসেবে ব্যবহৃত করা হয়।
৫. Named Arguments (নামকরা আর্গুমেন্ট)
রুবি 2.0 এবং তার পরবর্তী সংস্করণে Named Arguments বা Keyword Arguments ব্যবহৃত হয়। এতে আপনি আর্গুমেন্টের নাম উল্লেখ করে পাস করতে পারেন, যা কোডকে আরও পরিষ্কার ও পঠনযোগ্য করে তোলে।
উদাহরণ: নামকরা আর্গুমেন্ট
def greet(name:, age:)
puts "Hello, #{name}! You are #{age} years old."
end
greet(name: "আজিজ", age: 25) # আউটপুট: Hello, আজিজ! You are 25 years old.এখানে, name এবং age আর্গুমেন্টের নাম উল্লেখ করে তাদের মান পাস করা হয়েছে।
৬. Combination of Positional and Keyword Arguments (পজিশনাল এবং কিওয়ার্ড আর্গুমেন্টের সংমিশ্রণ)
রুবি আপনাকে পজিশনাল আর্গুমেন্ট এবং কিওয়ার্ড আর্গুমেন্ট একসঙ্গে ব্যবহার করতে দেয়, তবে কিওয়ার্ড আর্গুমেন্ট সবসময় পজিশনাল আর্গুমেন্টের পরে থাকতে হবে।
উদাহরণ: পজিশনাল এবং কিওয়ার্ড আর্গুমেন্টের সংমিশ্রণ
def greet(name, age:, city:)
puts "Hello, #{name}! You are #{age} years old and live in #{city}."
end
greet("আজিজ", age: 25, city: "Dhaka") # আউটপুট: Hello, আজিজ! You are 25 years old and live in Dhaka.এখানে, name পজিশনাল আর্গুমেন্ট হিসেবে এবং age ও city কিওয়ার্ড আর্গুমেন্ট হিসেবে পাস করা হয়েছে।
সারসংক্ষেপ
- Methods এ আর্গুমেন্ট পাস করা রুবি প্রোগ্রামিং ভাষায় সহজ এবং নমনীয়, যা কোডের পুনঃব্যবহারযোগ্যতা বাড়ায়।
- Positional arguments সাধারণত মেথডের প্যারামিটার হিসেবে সরাসরি পাস করা হয়।
- Default arguments ব্যবহার করলে আপনি আর্গুমেন্ট না পাস করলেও একটি ডিফল্ট মান ব্যবহার করতে পারেন।
- Variable-length arguments মেথডে যে কোনও সংখ্যক আর্গুমেন্ট পাস করার সুযোগ দেয়।
- Named arguments বা Keyword arguments কোডের পঠনযোগ্যতা বাড়ায় এবং আর্গুমেন্টগুলির নাম উল্লেখ করে মান পাস করা যায়।
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কমান্ড দ্বারা কার্যকর করা হয়, যা ব্লকটির মধ্যে কোড এক্সিকিউট করে। - ব্লক আর্গুমেন্টও গ্রহণ করতে পারে, যা মেথডের মাধ্যমে পাঠানো হয়।
এটি রুবি প্রোগ্রামিং ভাষায় একটি শক্তিশালী এবং নমনীয় ফিচার, যা কোডের কার্যকারিতা এবং মডুলারিটি উন্নত করে।
Ruby প্রোগ্রামিং ভাষায় yield এবং block passing দুটি অত্যন্ত গুরুত্বপূর্ণ বৈশিষ্ট্য, যা ফাংশন বা মেথডের মধ্যে ব্লক পাস করা এবং ব্লকের সাথে ইন্টারঅ্যাকশন করতে ব্যবহৃত হয়। এগুলি কোডের পুনঃব্যবহারযোগ্যতা এবং নমনীয়তা বৃদ্ধি করে। yield একটি কীওয়ার্ড যা ব্লকের মধ্যে কোড প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়, এবং block passing হল ব্লক পাস করার একটি পদ্ধতি।
১. yield কী এবং এর ব্যবহার
yield একটি কীওয়ার্ড, যা মেথডের মধ্যে থাকা ব্লককে ডাকা বা কার্যকর করার জন্য ব্যবহৃত হয়। যখন আপনি একটি মেথডে একটি ব্লক পাস করেন, তখন মেথডটি yield ব্যবহার করে ব্লকের কোড এক্সিকিউট করতে পারে।
Syntax:
def method_with_block
yield # এখানে yield ব্লককে চালাবে
end
method_with_block { puts "Hello, Ruby!" }এখানে, method_with_block মেথডের মধ্যে yield ব্যবহার করা হয়েছে, যা পাস করা ব্লকটি চালাবে এবং আউটপুট হিসেবে "Hello, Ruby!" প্রিন্ট করবে।
উদাহরণ:
def greet
yield # ব্লককে চালাবে
end
greet { puts "Hello, World!" }
# আউটপুট: Hello, World!এখানে, greet মেথডে yield ব্যবহার করা হয়েছে, যা পাস করা ব্লককে এক্সিকিউট করবে।
২. ব্লক পাসিং (Block Passing)
ব্লক পাসিং হল মেথডে ব্লক পাস করার একটি পদ্ধতি, যেখানে আপনি মেথডের মাধ্যমে কোডের একটি অংশ বা ব্লক পাস করেন যা পরবর্তীতে yield বা অন্য কোনো পদ্ধতি দ্বারা এক্সিকিউট হবে। ব্লক পাস করা যায় মেথডের আর্গুমেন্ট হিসেবে {} বা do..end ব্যবহার করে।
Syntax:
def method_with_block
yield(parameter) # ব্লককে প্যারামিটার সহ চালানো
end
method_with_block { |name| puts "Hello, #{name}!" }উদাহরণ:
def print_sum(a, b)
yield(a + b) # এখানে yield ব্লককে পাস করা ফলাফলকে পাস করবে
end
print_sum(5, 3) { |sum| puts "The sum is #{sum}" }
# আউটপুট: The sum is 8এখানে, print_sum মেথডে দুইটি আর্গুমেন্ট (৫ এবং ৩) পাস করা হয়েছে, এবং yield ব্লকের মাধ্যমে a + b এর মান পাস করা হয়েছে। ব্লকটি তারপর sum প্যারামিটার হিসাবে সেই মান গ্রহণ করে এবং আউটপুট দেয়।
৩. yield এবং ব্লক পাসিংয়ে প্যারামিটার পাস করা
yield ব্যবহার করার সময় আপনি প্যারামিটার পাসও করতে পারেন, যাতে ব্লকটি সেই প্যারামিটার গ্রহণ করে কাজ করতে পারে।
Syntax:
def method_with_block
yield("Alice") # ব্লককে 'Alice' প্যারামিটার সহ চালাবে
end
method_with_block { |name| puts "Hello, #{name}!" }উদাহরণ:
def greet_person
yield("John") # 'John' প্যারামিটার পাস করা হচ্ছে
end
greet_person { |name| puts "Hello, #{name}!" }
# আউটপুট: Hello, John!এখানে greet_person মেথডে yield ব্যবহার করে "John" নামক প্যারামিটার পাস করা হয়েছে, এবং ব্লকটি সেই প্যারামিটার গ্রহণ করে আউটপুটে "Hello, John!" প্রিন্ট করেছে।
৪. yield এবং block_given?
block_given? একটি মেথড যা চেক করে যদি কোনো ব্লক মেথডের জন্য পাস করা হয়। এটি একটি বুলিয়ান মান (true বা false) প্রদান করে। যদি ব্লক পাস করা না হয়, তাহলে yield একটি ত্রুটি উৎপন্ন করবে, কিন্তু block_given? ব্যবহার করলে আপনি ব্লক থাকলে yield চালাতে পারেন এবং ব্লক না থাকলে আলাদা কোনো কোড এক্সিকিউট করতে পারেন।
Syntax:
def greet
if block_given?
yield
else
puts "No block given"
end
end
greet { puts "Hello, World!" } # আউটপুট: Hello, World!
greet # আউটপুট: No block givenএখানে, block_given? চেক করে ব্লক দেওয়া হয়েছে কি না, এবং তারপরে ব্লকটি এক্সিকিউট করা হয়। যদি ব্লক না থাকে, তাহলে "No block given" প্রদর্শিত হবে।
সারসংক্ষেপ
yield: একটি মেথডের মধ্যে ব্লককে এক্সিকিউট করার জন্য ব্যবহৃত হয়।- Block Passing: মেথডে ব্লক পাস করার পদ্ধতি, যাতে মেথড ব্লকটি এক্সিকিউট করে।
block_given?: চেক করে, মেথডে ব্লক পাস করা হয়েছে কি না।
রুবির yield এবং block passing টেকনিকগুলি মেথডগুলির মধ্যে ব্লকগুলির সাথে কার্যকরভাবে কাজ করতে সহায়ক, এবং এটি কোডের পুনঃব্যবহারযোগ্যতা এবং নমনীয়তা বৃদ্ধি করে।
Read more