নেস্টেড প্যাটার্ন (Nested Patterns) স্কালার প্যাটার্ন ম্যাচিং এর একটি শক্তিশালী ফিচার। প্যাটার্ন ম্যাচিং ব্যবহার করে আপনি একটি ভ্যালুর প্যাটার্নের সাথে তুলনা করে সেই ভ্যালুর উপর ভিত্তি করে কোড কার্যকর করতে পারেন। নেস্টেড প্যাটার্ন ব্যবহার করে আপনি একটি প্যাটার্নের ভিতরে আরও প্যাটার্ন ব্যবহার করতে পারেন, অর্থাৎ আপনি একাধিক স্তরের প্যাটার্ন ম্যাচিং করতে পারেন।
নেস্টেড প্যাটার্ন ব্যবহার করার ক্ষেত্রে দুটি মূল কনসেপ্ট:
- টার্নারি প্যাটার্ন (Tuple Pattern): যেখানে আপনি একাধিক মানের জন্য প্যাটার্ন ম্যাচিং করবেন।
- কেস ক্লাস প্যাটার্ন: যেখানে একাধিক স্তরে কেস ক্লাসের মধ্যে প্যাটার্ন ম্যাচিং হবে।
এখানে কিছু উদাহরণ দিয়ে নেস্টেড প্যাটার্ন সম্পর্কে আলোচনা করা হলো।
১. নেস্টেড প্যাটার্নের সাধারণ ব্যবহার
স্কালায় আপনি match ব্লক ব্যবহার করে একটি নেস্টেড প্যাটার্ন তৈরি করতে পারেন, যেখানে আপনি একাধিক স্তরের প্যাটার্ন ম্যাচিং করতে পারেন। উদাহরণস্বরূপ, টুপল বা লিস্টের মধ্যে ভ্যালু ম্যাচ করতে।
১.১ টার্নারি প্যাটার্ন (Tuple Pattern Matching)
এখানে টুপলের ভিতরে একটি ভ্যালুর সাথে প্যাটার্ন ম্যাচিং করা হচ্ছে।
val point = (3, 4)
point match {
case (x, y) if x == y => println("Point is on the line y = x") // When x and y are equal
case (x, y) => println(s"Point is at ($x, $y)") // Default case
}এখানে, টুপলে প্রথম দুটি ভ্যালু (x এবং y) নেস্টেড প্যাটার্ন দিয়ে মেলা হচ্ছে।
আউটপুট:
Point is at (3, 4)১.২ নেস্টেড প্যাটার্ন সহ কেস ক্লাস (Nested Pattern Matching with Case Classes)
আপনি কেস ক্লাসের মধ্যে নেস্টেড প্যাটার্ন ব্যবহার করতে পারেন, যেখানে একাধিক কেস ক্লাস বা সাব ক্লাসের সাথে মেলানো হয়।
sealed trait Animal
case class Dog(name: String, age: Int) extends Animal
case class Cat(name: String, breed: String) extends Animal
val pet: Animal = Dog("Rex", 5)
pet match {
case Dog(name, age) if age > 2 => println(s"$name is an adult dog.") // Nested pattern
case Dog(name, age) => println(s"$name is a puppy.")
case Cat(name, breed) => println(s"$name is a $breed cat.")
}এখানে, কেস ক্লাসের মধ্যে নেস্টেড প্যাটার্ন ব্যবহার করে Dog এবং Cat এর ভ্যালু মেলা হচ্ছে। Dog এর বয়স চেক করা হচ্ছে এবং বয়স অনুযায়ী প্যাটার্ন ম্যাচ করা হচ্ছে।
আউটপুট:
Rex is an adult dog.১.৩ লিস্ট প্যাটার্ন ম্যাচিং
নেস্টেড প্যাটার্নের একটি সাধারণ উদাহরণ হল লিস্টের ভিতরে উপাদানগুলির উপর প্যাটার্ন ম্যাচিং করা। এখানে, আপনি একটি লিস্টের প্রথম উপাদান এবং বাকি উপাদানগুলির উপর প্যাটার্ন ম্যাচ করতে পারেন।
val numbers = List(1, 2, 3, 4)
numbers match {
case List(1, x, y, z) => println(s"List starts with 1 and the next elements are: $x, $y, $z")
case List(1, _*) => println("List starts with 1, but the rest is unknown")
case _ => println("No match")
}এখানে, প্রথম উপাদান চেক করা হচ্ছে এবং বাকি উপাদানগুলোর উপর প্যাটার্ন ম্যাচ করা হচ্ছে।
আউটপুট:
List starts with 1 and the next elements are: 2, 3, 4১.৪ নেস্টেড প্যাটার্ন সহ অপশনাল টাইপ
স্কালায় Option টাইপও নেস্টেড প্যাটার্নের জন্য ব্যবহার করা যায়, যেখানে Some এবং None কে পৃথকভাবে চেক করা হয়।
val maybeNumber: Option[Int] = Some(42)
maybeNumber match {
case Some(x) if x > 40 => println(s"Number is greater than 40: $x") // Nested pattern inside Some
case Some(x) => println(s"Number is: $x")
case None => println("No number provided")
}এখানে, Some(x) ভিতরের ভ্যালু চেক করা হচ্ছে এবং একটি নির্দিষ্ট শর্ত (যেমন 40 এর বেশি) পূরণ হলে একটি পৃথক আউটপুট প্রদান করা হচ্ছে।
আউটপুট:
Number is greater than 40: 42২. নেস্টেড প্যাটার্নের সুবিধা এবং ব্যবহার
- কোডের পাঠযোগ্যতা: নেস্টেড প্যাটার্ন আপনাকে জটিল ডেটা স্ট্রাকচারের মধ্যে সহজেই প্যাটার্ন ম্যাচ করতে সাহায্য করে, ফলে কোড আরও পরিষ্কার এবং সংক্ষিপ্ত হয়।
- ডেটার গভীরে কাজ করার ক্ষমতা: যখন ডেটার গভীরে কাজ করতে হয় (যেমন টুপল, লিস্ট, অপশন, কেস ক্লাস), তখন নেস্টেড প্যাটার্ন খুবই উপকারী।
- ফাংশনাল প্রোগ্রামিং: নেস্টেড প্যাটার্ন ফাংশনাল প্রোগ্রামিংয়ের জন্য খুবই শক্তিশালী একটি টুল, যেখানে আপনি ডেটার প্রতিটি স্তরের উপর কাজ করতে পারেন।
সারাংশ
- নেস্টেড প্যাটার্ন হল একটি শক্তিশালী প্যাটার্ন ম্যাচিং কৌশল যেখানে আপনি একাধিক স্তরের ডেটা স্ট্রাকচারের উপর প্যাটার্ন ম্যাচ করতে পারেন।
- এটি টুপল, লিস্ট, কেস ক্লাস এবং অপশনাল টাইপের মতো ডেটা স্ট্রাকচারে কার্যকরীভাবে কাজ করতে ব্যবহৃত হয়।
- স্কালার
matchব্লক এবংcaseপ্যাটার্ন স্টেটমেন্ট ব্যবহার করে নেস্টেড প্যাটার্ন তৈরি করা যায়।
নেস্টেড প্যাটার্ন স্কালার ফাংশনাল প্রোগ্রামিংয়ের এক গুরুত্বপূর্ণ এবং শক্তিশালী কনসেপ্ট, যা কোডের কার্যকারিতা বৃদ্ধি করতে এবং ডেটা ম্যানিপুলেশন সহজ করতে সাহায্য করে।
Read more