রুবি একটি অত্যন্ত শক্তিশালী এবং নমনীয় ভাষা, যেখানে আপনি define_method এবং send মেথডের মাধ্যমে dynamic method invocation এবং dynamic method definition করতে পারেন। এই দুটি মেথডের সাহায্যে কোডের নমনীয়তা, পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বৃদ্ধি করা সম্ভব।
১. define_method
define_method রুবিতে একটি মেথডকে ডাইনামিকভাবে (dynamic) তৈরি করার জন্য ব্যবহৃত হয়। এর মাধ্যমে, আপনি কোনো নির্দিষ্ট মেথডের নাম এবং কোড ব্লক তৈরি করতে পারেন রানটাইমে, যা প্রচলিত পদ্ধতিতে করা যায় না।
Syntax:
define_method(:method_name) do |parameters|
# method body
endএটি সাধারণত ক্লাসের মধ্যে ডাইনামিক মেথড তৈরি করতে ব্যবহৃত হয়।
উদাহরণ:
class Person
define_method(:greet) do |name|
puts "Hello, #{name}!"
end
end
person = Person.new
person.greet("Alice") # Output: Hello, Alice!এখানে, define_method মেথডটি greet নামক একটি নতুন মেথড তৈরি করছে। এই মেথডটি name প্যারামিটার নিয়ে একটি শুভেচ্ছা বার্তা প্রিন্ট করে।
define_method দিয়ে যে মেথড তৈরি হয়, তা instance method হিসেবে কাজ করে।
ব্যবহার:
- Dynamic Method Creation: যখন আপনি জানেন না যে কোন মেথড তৈরি করবেন, তখন
define_methodব্যবহার করতে পারেন। - DRY Principle: কোডের পুনঃব্যবহারযোগ্যতা নিশ্চিত করতে
define_methodসাহায্য করে।
২. send
send মেথডটি রুবির একটি শক্তিশালী ফিচার, যা আপনাকে একটি মেথডের নামকে ডাইনামিকভাবে কল করতে সক্ষম করে। এটি মূলত কোনো মেথডের নাম স্ট্রিং বা সিম্বল আকারে পাস করার মাধ্যমে সেই মেথড কল করতে ব্যবহৃত হয়। আপনি এটি দিয়ে প্রাইভেট এবং প্রটেক্টেড মেথডও কল করতে পারেন, যা সাধারণত মেনে চলা হয় না।
Syntax:
object.send(:method_name, *arguments)method_name: কল করার মেথডের নাম (যা সিম্বল বা স্ট্রিং আকারে হতে পারে)।*arguments: যেকোনো প্যারামিটার যেগুলি মেথডে পাস করা হবে।
উদাহরণ:
class Person
def greet(name)
puts "Hello, #{name}!"
end
end
person = Person.new
person.send(:greet, "Bob") # Output: Hello, Bob!এখানে, send মেথডের মাধ্যমে greet মেথডটি ডাইনামিকভাবে কল করা হচ্ছে।
উদাহরণ: Private Method Call via send
class Person
private
def secret
"This is a secret!"
end
end
person = Person.new
puts person.send(:secret) # Output: This is a secret!এখানে, secret মেথডটি private হওয়া সত্ত্বেও send মেথডের মাধ্যমে এক্সেস করা হয়েছে।
ব্যবহার:
- Dynamic Method Invocation: যখন মেথডের নাম runtime-এ পরিবর্তিত হতে পারে, তখন
sendব্যবহার করা হয়। - Access Private Methods:
sendব্যবহার করে আপনি private এবং protected মেথডও কল করতে পারেন।
define_method এবং send এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | define_method | send |
|---|---|---|
| কাজ | ডাইনামিকভাবে একটি নতুন মেথড তৈরি করা | ইতিমধ্যে উপস্থিত কোনো মেথডকে ডাইনামিকভাবে কল করা |
| ব্যবহার | মেথড তৈরি করতে ব্যবহৃত হয় | মেথড কল করতে ব্যবহৃত হয় |
| মেথডের স্কোপ | একটি ক্লাস বা অবজেক্টের মেথড হিসেবে তৈরি করা হয় | অবজেক্টের যে কোন মেথড কল করা যায় |
| প্রাইভেট মেথড | define_method শুধু public মেথড তৈরি করতে ব্যবহার করা হয় | send প্রাইভেট এবং প্রটেক্টেড মেথডও কল করতে পারে |
| নাম প্যারামিটার | define_method এর মধ্যে মেথড নামটি সিম্বল বা স্ট্রিং আকারে দেওয়া হয় | send এর মধ্যে মেথড নাম স্ট্রিং বা সিম্বল আকারে দেওয়া হয় |
সারসংক্ষেপ
define_method: ডাইনামিকভাবে মেথড তৈরি করতে ব্যবহৃত হয়। এটি ক্লাস বা অবজেক্টের মধ্যে নতুন মেথড সংজ্ঞায়িত করতে সাহায্য করে।send: ডাইনামিকভাবে কোনো মেথড কল করতে ব্যবহৃত হয়। এটি মেথডের নাম এবং প্যারামিটারগুলি স্ট্রিং বা সিম্বল আকারে গ্রহণ করে।define_methodসাধারণত new methods তৈরি করতে ব্যবহৃত হয়, এবংsendব্যবহৃত হয় existing methods ডাইনামিকভাবে কল করতে।
এই দুটি মেথড রুবির ডাইনামিক প্রকৃতির সুবিধা নিয়ে আসে, এবং কোডের নমনীয়তা এবং কার্যকারিতা বৃদ্ধি করে।
Read more