স্কালা (Scala) একটি শক্তিশালী, বহুমুখী এবং আধুনিক প্রোগ্রামিং ভাষা। এটি অবজেক্ট-অরিয়েন্টেড এবং ফাংশনাল প্রোগ্রামিং প্যারাডাইম সমর্থন করে, যার কারণে কোড লেখার সময় এটি অত্যন্ত সহজ এবং দক্ষ। এখানে স্কালার বেসিক প্রোগ্রামিং সম্পর্কে কিছু গুরুত্বপূর্ণ ধারণা এবং কোড উদাহরণ আলোচনা করা হলো।
১. স্কালা প্রোগ্রামের কাঠামো
স্কালার প্রোগ্রাম সাধারণত একটি object দিয়ে শুরু হয়। স্কালায় সবকিছু একটি অবজেক্টের মধ্যে থাকতে হয়, যা প্রধান পদ্ধতির কাজ করে। main মেথডটি প্রধান প্রবাহ শুরু করে।
উদাহরণ:
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, Scala!")
}
}এখানে:
objectহল স্কালার একটি কনস্ট্রাক্ট যা একটি একক ইনস্ট্যান্স তৈরি করে।def mainহল মূল মেথড যেখানে কোডের কার্যক্রম শুরু হয়।printlnএকটি বিল্ট-ইন ফাংশন যা কনসোলে আউটপুট প্রদর্শন করে।
২. ভ্যারিয়েবল এবং ডেটা টাইপস
স্কালায় আপনি ভ্যারিয়েবল (variable) ব্যবহার করতে পারেন, যা সাধারণত val অথবা var দিয়ে ডিফাইন করা হয়।
- val: ইমিউটেবল (immutable) ভ্যারিয়েবল, যা একবার মান অ্যাসাইন করার পর পরিবর্তন করা যায় না।
- var: মিউটেবল (mutable) ভ্যারিয়েবল, যা পুনরায় মান অ্যাসাইন করা যায়।
উদাহরণ:
object VariablesExample {
def main(args: Array[String]): Unit = {
val x: Int = 10 // Immutable variable
var y: Int = 20 // Mutable variable
println("x: " + x)
println("y: " + y)
// Uncommenting the next line will cause an error because val cannot be reassigned
// x = 15
y = 25 // This is allowed as y is a var
println("Updated y: " + y)
}
}৩. কন্ডিশনাল স্টেটমেন্ট (If-Else)
স্কালায় কন্ডিশনাল স্টেটমেন্ট যেমন if-else ব্যবহৃত হয় যেমন অন্য ভাষায় ব্যবহৃত হয়।
উদাহরণ:
object IfElseExample {
def main(args: Array[String]): Unit = {
val number = 10
if (number > 0) {
println("Positive Number")
} else {
println("Negative Number or Zero")
}
}
}এখানে, if-else ব্লক ব্যবহার করে number এর মানের উপর ভিত্তি করে আউটপুট প্রদান করা হচ্ছে।
৪. ফাংশন (Functions)
স্কালায় ফাংশন ডিফাইন করা হয় def কীওয়ার্ড দিয়ে। ফাংশন কনস্ট্রাক্টে আর্গুমেন্ট এবং রিটার্ন টাইপ উল্লেখ করা হয়।
উদাহরণ:
object FunctionExample {
def add(a: Int, b: Int): Int = {
return a + b
}
def main(args: Array[String]): Unit = {
val sum = add(5, 10)
println("Sum: " + sum)
}
}এখানে:
addহল একটি ফাংশন যা দুটি পূর্ণসংখ্যাকে ইনপুট হিসেবে গ্রহণ করে এবং তাদের যোগফল রিটার্ন করে।
৫. লুপ (Loops)
স্কালায় সাধারণভাবে for এবং while লুপ ব্যবহার করা হয়।
For Loop Example:
object ForLoopExample {
def main(args: Array[String]): Unit = {
for (i <- 1 to 5) {
println(i)
}
}
}এখানে:
forলুপ ১ থেকে ৫ পর্যন্ত সংখ্যা প্রিন্ট করবে।
While Loop Example:
object WhileLoopExample {
def main(args: Array[String]): Unit = {
var i = 1
while (i <= 5) {
println(i)
i += 1
}
}
}এখানে:
whileলুপ ব্যবহার করে ১ থেকে ৫ পর্যন্ত সংখ্যা প্রিন্ট করা হচ্ছে।
৬. অ্যারেগেটস (Arrays) এবং লিস্ট (Lists)
স্কালা প্রোগ্রামিং ভাষায় অ্যারেগেটস এবং লিস্ট দুটি গুরুত্বপূর্ণ ডাটা স্ট্রাকচার।
অ্যারেতে উপাদান যোগ করা:
object ArrayExample {
def main(args: Array[String]): Unit = {
val numbers = Array(1, 2, 3, 4, 5)
for (num <- numbers) {
println(num)
}
}
}লিস্ট:
object ListExample {
def main(args: Array[String]): Unit = {
val fruits = List("Apple", "Banana", "Cherry")
for (fruit <- fruits) {
println(fruit)
}
}
}এখানে:
- Array ডাটা স্ট্রাকচারে আপনি নির্দিষ্ট ইনডেক্সে অ্যাক্সেস করতে পারেন।
- List একটি ইমিউটেবল ডাটা স্ট্রাকচার, যেখানে উপাদান পরিবর্তন করা যায় না।
৭. ম্যাপ (Maps)
স্কালায় ম্যাপ ডাটা স্ট্রাকচার খুবই জনপ্রিয়, যেখানে কী (key) এবং মান (value) পেয়ার হিসেবে ডেটা সংরক্ষণ করা হয়।
উদাহরণ:
object MapExample {
def main(args: Array[String]): Unit = {
val capitals = Map("India" -> "New Delhi", "USA" -> "Washington D.C.", "Japan" -> "Tokyo")
println("Capital of India: " + capitals("India"))
println("Capital of USA: " + capitals("USA"))
}
}এখানে:
- Map ডাটা স্ট্রাকচারে দেশ এবং তাদের রাজধানীর নাম কী-মান পেয়ার হিসেবে সংরক্ষিত।
সারাংশ
স্কালা প্রোগ্রামিং ভাষার বেসিক ধারণাগুলি অনেক শক্তিশালী এবং বহুমুখী। এটি প্রোগ্রামিংয়ের জগতে অবজেক্ট-অরিয়েন্টেড এবং ফাংশনাল প্রোগ্রামিংয়ের সমন্বয় ঘটিয়ে উন্নত এবং সহজ কোড লেখার সুবিধা প্রদান করে। এই বেসিক কোড উদাহরণগুলির মাধ্যমে স্কালা প্রোগ্রামিংয়ের ধারণাগুলি সহজে শেখা যায়। আপনি যদি আরও কোনো বিষয় জানতে চান, আমাকে জানাতে পারেন!
স্কালা একটি উচ্চ স্তরের প্রোগ্রামিং ভাষা যা সাধারণভাবে জাভা ভি-এম (JVM) এ চলে এবং অবজেক্ট-অরিয়েন্টেড ও ফাংশনাল প্রোগ্রামিংয়ের সমন্বয়ে কাজ করে। স্কালার সিনট্যাক্স এবং ফাইল স্ট্রাকচার কিছুটা আলাদা, কিন্তু সেগুলি খুবই পরিষ্কার এবং কোডের কার্যকারিতা সহজ করে দেয়।
১. স্কালা সিনট্যাক্স (Scala Syntax)
স্কালা প্রোগ্রামিং ভাষার সিনট্যাক্স অনেকটা জাভার মতো হলেও কিছু ক্ষেত্রে এটি আরও সংক্ষিপ্ত এবং শক্তিশালী। এখানে কিছু বেসিক স্কালা সিনট্যাক্স দেওয়া হলো:
১.১ অবজেক্ট (Object)
স্কালা প্রোগ্রাম শুরু হয় object কিওয়ার্ড দিয়ে। স্কালায় সমস্ত কোড একটি object-এর মধ্যে থাকতে হয়, যেখানে main মেথড থাকা আবশ্যক।
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, Scala!")
}
}objectব্যবহার করে স্কালায় একটি একক ইনস্ট্যান্স তৈরি করা হয়।def mainহল প্রধান মেথড যা কোডের কার্যক্রম শুরু করে।
১.২ ভ্যারিয়েবল (Variables)
স্কালায় ভ্যারিয়েবল দুটি ধরনের হয়: immutable (যেগুলি পরিবর্তন করা যায় না) এবং mutable (যেগুলি পরিবর্তন করা যায়)।
- val: Immutable ভ্যারিয়েবল (একবার মান অ্যাসাইন করার পর পরিবর্তন করা যায় না)
- var: Mutable ভ্যারিয়েবল (পুনরায় মান অ্যাসাইন করা যায়)
val x: Int = 10 // Immutable variable
var y: Int = 20 // Mutable variable
y = 25 // This is allowed as y is a var
println(x) // Output: 10
println(y) // Output: 25১.৩ কন্ডিশনাল স্টেটমেন্ট (If-Else)
স্কালায় if-else কন্ডিশনাল স্টেটমেন্ট সাধারণভাবে ব্যবহৃত হয়।
val number = 10
if (number > 0) {
println("Positive number")
} else {
println("Negative or Zero")
}১.৪ ফাংশন (Functions)
স্কালায় ফাংশন ডিফাইন করা হয় def কিওয়ার্ড দিয়ে। একটি ফাংশনে আর্গুমেন্ট এবং রিটার্ন টাইপ থাকতে পারে।
def add(a: Int, b: Int): Int = {
return a + b
}
val result = add(5, 10)
println(result) // Output: 15১.৫ লুপ (Loops)
স্কালায় for এবং while লুপ ব্যবহার করা হয়।
For Loop:
for (i <- 1 to 5) { println(i) }While Loop:
var i = 1 while (i <= 5) { println(i) i += 1 }
১.৬ ক্লাস (Classes)
স্কালায় ক্লাস তৈরি করতে class কিওয়ার্ড ব্যবহার করা হয়।
class Person(name: String, age: Int) {
def greet() = {
println(s"Hello, my name is $name and I am $age years old.")
}
}
val person = new Person("Alice", 30)
person.greet() // Output: Hello, my name is Alice and I am 30 years old.২. স্কালা ফাইল স্ট্রাকচার (Scala File Structure)
স্কালা প্রোগ্রামগুলোর একটি নির্দিষ্ট ফাইল স্ট্রাকচার থাকে যা ব্যবহৃত প্রজেক্টের ধরন অনুযায়ী ভিন্ন হতে পারে। সাধারণভাবে স্কালার ফাইল স্ট্রাকচার হল:
২.১ একটি স্কালা ফাইলের মৌলিক কাঠামো
স্কালা ফাইলের একমাত্র গুরুত্বপূর্ণ অংশ হলো object বা class যেখানে আপনার কোড সংরক্ষিত থাকবে। একটি স্কালা প্রোগ্রাম সাধারণত .scala এক্সটেনশনের সাথে সংরক্ষিত হয়।
ফাইলের সাধারণ কাঠামো:
src/
└── main/
└── scala/
└── HelloWorld.scalaউদাহরণ:
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, Scala!")
}
}২.২ প্রোজেক্ট স্ট্রাকচার
যদি আপনি একটি বৃহত্তর স্কালা প্রোজেক্ট তৈরি করেন, তবে সাধারণত নিচের মত একটি ফোল্ডার স্ট্রাকচার থাকবে:
project/
├── build.sbt
├── src/
│ ├── main/
│ │ ├── scala/
│ │ │ ├── Main.scala
│ │ └── resources/
│ └── test/
│ ├── scala/
│ └── resources/
├── lib/
└── target/src/main/scala/: এখানে আপনার মূল স্কালা সোর্স কোড থাকবে।src/test/scala/: এখানে টেস্ট কোড থাকবে।build.sbt: এটি SBT কনফিগারেশন ফাইল যা স্কালা প্রোজেক্টের ডিপেন্ডেন্সি এবং বিল্ড কনফিগারেশন নির্ধারণ করে।
২.৩ SBT ফাইল (build.sbt)
build.sbt হল স্কালা প্রোজেক্টের জন্য একটি কনফিগারেশন ফাইল যেখানে প্রোজেক্টের তথ্য এবং ডিপেন্ডেন্সি সেটআপ করা হয়। উদাহরণ:
name := "MyScalaProject"
version := "0.1"
scalaVersion := "2.13.6"
libraryDependencies += "org.scala-lang" % "scala-compiler" % "2.13.6"এই ফাইলের মাধ্যমে প্রোজেক্টের স্কালা সংস্করণ এবং প্রয়োজনীয় লাইব্রেরিগুলি যুক্ত করা হয়।
৩. স্কালা প্রোজেক্টের পরিচালনা (Project Management)
SBT (Simple Build Tool) ব্যবহার করে স্কালা প্রোজেক্ট পরিচালনা করা হয়। এটি স্কালার জন্য একটি বিল্ড টুল যা ডিপেন্ডেন্সি ম্যানেজমেন্ট এবং বিল্ড প্রক্রিয়া সহজ করে তোলে। SBT প্রোজেক্টের ডিপেন্ডেন্সি, টেস্টিং এবং বিল্ড সিস্টেম পরিচালনা করতে ব্যবহৃত হয়।
SBT ব্যবহার করে প্রোজেক্ট তৈরি:
- প্রোজেক্ট ফোল্ডার তৈরি করুন:
- প্রোজেক্টের জন্য একটি নতুন ফোল্ডার তৈরি করুন এবং সেখানে
build.sbtফাইল তৈরি করুন।
- প্রোজেক্টের জন্য একটি নতুন ফোল্ডার তৈরি করুন এবং সেখানে
- লইব্রেরি ডিপেন্ডেন্সি যুক্ত করুন:
libraryDependenciesএ লাইব্রেরি ডিপেন্ডেন্সি লিখুন।
সারাংশ
স্কালার সিনট্যাক্স সোজা এবং শক্তিশালী। এর ফাইল স্ট্রাকচার সাধারণভাবে src/main/scala/ এবং src/test/scala/ ফোল্ডারে কোড সংরক্ষণ করে, যেখানে build.sbt কনফিগারেশন ফাইল থাকে। স্কালা প্রোগ্রামগুলি খুবই সংক্ষিপ্ত এবং কার্যকরী, এবং ফাংশনাল ও অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিংয়ের সুবিধা একসাথে ব্যবহার করতে সক্ষম।
স্কালা একটি স্ট্যাটিক্যালি টাইপড ভাষা, যার মানে হল যে প্রোগ্রামের কম্পাইলের সময় প্রতিটি ভ্যারিয়েবলের টাইপ নির্ধারণ করা হয়। তবে স্কালার টাইপ সিস্টেমে টাইপ ইনফারেন্স রয়েছে, যা কোড লেখার সময় টাইপগুলো স্বয়ংক্রিয়ভাবে অনুমান করে, ফলে আপনি টাইপ নির্ধারণ করতে অনেক সময় কম প্রয়োজন হয়।
স্কালায় ভ্যারিয়েবল এবং ডেটা টাইপের ব্যবহার সম্পর্কে বিস্তারিত জানুন।
১. ভ্যারিয়েবল (Variables)
স্কালায় দুই ধরনের ভ্যারিয়েবল ডিফাইন করা হয়:
val: Immutable (অপরিবর্তনীয়) ভ্যারিয়েবল।var: Mutable (পরিবর্তনযোগ্য) ভ্যারিয়েবল।
১.১ val - Immutable ভ্যারিয়েবল
val দিয়ে ডিফাইন করা ভ্যারিয়েবল একটি নির্দিষ্ট মান অ্যাসাইন করার পর সেটি আর পরিবর্তন করা যায় না।
উদাহরণ:
val x: Int = 10 // Immutable variable
println(x) // Output: 10
// Trying to reassign 'x' will result in a compile-time error
// x = 20 // Error: reassignment to val১.২ var - Mutable ভ্যারিয়েবল
var দিয়ে ডিফাইন করা ভ্যারিয়েবল পরিবর্তনযোগ্য। আপনি একাধিক বার এর মান পরিবর্তন করতে পারেন।
উদাহরণ:
var y: Int = 20 // Mutable variable
println(y) // Output: 20
y = 30 // Reassigning value to 'y'
println(y) // Output: 30২. ডেটা টাইপ (Data Types)
স্কালায় সাধারণত ব্যবহৃত ডেটা টাইপগুলির মধ্যে রয়েছে:
- প্রাথমিক ডেটা টাইপ (Primitive Data Types):
Int: পূর্ণসংখ্যা (Integer)Double: দশমিক সংখ্যা (Floating-point number)Boolean: সত্য/মিথ্যা মান (True/False)Char: একটি একক অক্ষরString: টেক্সট বা অক্ষরের সিকোয়েন্সUnit: কোনো মান ফেরত না দেওয়ার জন্য (যেমন void in other languages)Null: কোন অবজেক্ট নেই এমন মানNothing: সমস্ত ধরনের ত্রুটি বা ব্যতিক্রমের ক্ষেত্রে ব্যবহৃত
২.১ Int - পূর্ণসংখ্যা
Int টাইপের মান পূর্ণসংখ্যা হিসেবে ব্যবহৃত হয়।
উদাহরণ:
val num1: Int = 100
println(num1) // Output: 100২.২ Double - দশমিক সংখ্যা
Double টাইপের মান দশমিক সংখ্যা (ফ্লোটিং পয়েন্ট) হিসেবে ব্যবহৃত হয়।
উদাহরণ:
val num2: Double = 20.5
println(num2) // Output: 20.5২.৩ Boolean - বুলিয়ান
Boolean টাইপের মান true বা false হতে পারে।
উদাহরণ:
val flag: Boolean = true
println(flag) // Output: true২.৪ Char - অক্ষর
Char টাইপে একটি একক অক্ষর রাখা হয়। এটি সাধারণত একক উল্লিখিত (‘ ’) চিহ্নে লেখা হয়।
উদাহরণ:
val letter: Char = 'A'
println(letter) // Output: A২.৫ String - স্ট্রিং
String টাইপটি একাধিক অক্ষরের সিকোয়েন্স ধারণ করে। এটি সাধারণত " " চিহ্নের মধ্যে লেখা হয়।
উদাহরণ:
val name: String = "Scala"
println(name) // Output: Scala২.৬ Unit - কোন মান ফেরত না দেওয়া
Unit টাইপটি ফাংশন বা মেথডের জন্য ব্যবহৃত হয়, যা কোনো মান ফেরত দেয় না, বা কার্যকলাপের শেষ হতে পারে (যেমন void in Java, None in Python)।
উদাহরণ:
def greet(): Unit = {
println("Hello, Scala!")
}
greet() // Output: Hello, Scala!২.৭ Null - নাল
Null টাইপ একটি অবজেক্ট নেই এমন মানের প্রতিনিধিত্ব করে। এটি সাধারণত রেফারেন্স টাইপের জন্য ব্যবহৃত হয়।
উদাহরণ:
val name: String = null // This will cause an error as String is a non-nullable type২.৮ Nothing - কোন ফলাফল নেই
Nothing একটি বিশেষ ডেটা টাইপ, যা কোনো প্রকার ফলাফল বা মান ফেরত দেয় না এবং এটি সাধারণত ব্যতিক্রম ঘটানোর ক্ষেত্রে ব্যবহৃত হয়।
উদাহরণ:
def throwError(): Nothing = {
throw new RuntimeException("Something went wrong!")
}৩. টাইপ ইনফারেন্স (Type Inference)
স্কালা একটি টাইপ ইনফারেন্স সিস্টেম ব্যবহার করে, যার মানে আপনি ভ্যারিয়েবল ডিফাইন করার সময় টাইপ উল্লেখ না করলেও স্কালা তা স্বয়ংক্রিয়ভাবে অনুমান করতে পারে।
উদাহরণ:
val num = 100 // Scala infers that num is of type Int
val message = "Hello, Scala!" // Scala infers that message is of type Stringএখানে টাইপ Int এবং String স্বয়ংক্রিয়ভাবে অনুমান করা হয়েছে, এবং আপনাকে টাইপ উল্লেখ করার দরকার নেই।
৪. টাইপ কাস্টিং (Type Casting)
স্কালায় টাইপ কাস্টিং করা সম্ভব। কিছু ক্ষেত্রে, আপনাকে এক টাইপের মান অন্য টাইপে রূপান্তর (cast) করতে হতে পারে।
উদাহরণ:
val doubleValue: Double = 5.6
val intValue: Int = doubleValue.toInt // Converting Double to Int (Truncates the decimal part)
println(intValue) // Output: 5সারাংশ
স্কালায় ভ্যারিয়েবল ডিফাইন করার জন্য val এবং var ব্যবহৃত হয়, যেখানে val ইমিউটেবল এবং var মিউটেবল ভ্যারিয়েবল হিসেবে কাজ করে। স্কালায় বিভিন্ন ধরনের ডেটা টাইপ রয়েছে যেমন Int, Double, Boolean, String, Char, Unit, Null এবং Nothing। টাইপ ইনফারেন্সের কারণে কোড লেখার সময় টাইপগুলো স্বয়ংক্রিয়ভাবে নির্ধারণ হয়ে থাকে, যা স্কালাকে আরো সহজ এবং সংক্ষিপ্ত করে তোলে।
স্কালা প্রোগ্রামিং ভাষায় লিটারেলস (Literals) এবং কনস্ট্যান্টস (Constants) গুরুত্বপূর্ণ ভূমিকা পালন করে। এগুলি ভেরিয়েবল, ফাংশন বা ডাটা স্ট্রাকচারকে নির্দিষ্ট মান প্রদান করতে ব্যবহৃত হয়। স্কালায় লিটারেলস এবং কনস্ট্যান্টস এর বিভিন্ন ধরনের আছে, যেগুলি কোডের মধ্যে নির্দিষ্ট মান বা ডাটা সংরক্ষণ করতে ব্যবহৃত হয়।
১. স্কালা লিটারেলস (Scala Literals)
লিটারেল হল এমন একটি মান যা সরাসরি কোডে লিখিত হয় এবং এটি একটি ভেরিয়েবল, কনস্ট্যান্ট বা এক্সপ্রেশনের মাধ্যমে পরিবর্তিত হয় না। স্কালায় বিভিন্ন ধরনের লিটারেল রয়েছে, যেমন: নম্বর লিটারেলস, স্ট্রিং লিটারেলস, বুলিয়ান লিটারেলস, চর লিটারেলস ইত্যাদি।
১.১ নম্বর লিটারেলস (Number Literals)
স্কালায় বিভিন্ন ধরনের নম্বর লিটারেল ব্যবহার করা হয়, যেমন ইন্টিজার (Int), ডাবল (Double), ফ্লোট (Float), লং (Long), ইত্যাদি।
val intVal: Int = 100 // Integer literal
val doubleVal: Double = 3.14 // Double literal
val floatVal: Float = 3.14F // Float literal (F at the end)
val longVal: Long = 100000L // Long literal (L at the end)এখানে:
100,3.14,3.14F, এবং100000Lহল লিটারেল মান যা বিভিন্ন ডাটা টাইপের জন্য ব্যবহৃত হচ্ছে।
১.২ স্ট্রিং লিটারেলস (String Literals)
স্কালায় স্ট্রিং লিটারেল সাধারণভাবে " এর মধ্যে লেখা হয়।
val greeting: String = "Hello, Scala!"
val multiLine: String = """This is
a multi-line
string"""এখানে:
"Hello, Scala!"একটি সাধারণ স্ট্রিং লিটারেল।"""This is..."""হলো মাল্টি-লাইন স্ট্রিং লিটারেল, যা একাধিক লাইনে স্ট্রিং সংরক্ষণ করতে ব্যবহৃত হয়।
১.৩ চর লিটারেলস (Character Literals)
স্কালায় একটি চর লিটারেল একটি একক অক্ষর দ্বারা নির্দিষ্ট হয়, যা সাধারণত ' দ্বারা ঘিরে রাখা হয়।
val letter: Char = 'A' // Character literalএখানে:
'A'একটি চর লিটারেল।
১.৪ বুলিয়ান লিটারেলস (Boolean Literals)
বুলিয়ান লিটারেল দুটি মান নিয়ে কাজ করে: true এবং **false**।
val isScalaFun: Boolean = true // Boolean literal
val isJavaFun: Boolean = false // Boolean literalএখানে:
trueএবংfalseহল বুলিয়ান লিটারেলস।
১.৫ নাল লিটারেল (Null Literals)
স্কালায় null একটি বিশেষ লিটারেল যা কোনো অবজেক্ট রেফারেন্সকে নির্দেশ করে না।
val someObject: String = null // Null literalএখানে:
nullএকটি নাল লিটারেল যা মানে এটি কোনো অবজেক্ট বা মানের রেফারেন্স নেই।
২. স্কালা কনস্ট্যান্টস (Scala Constants)
স্কালায় কনস্ট্যান্টস হল এমন ভেরিয়েবল যা একবার ইনিশিয়ালাইজ করার পর কখনও পরিবর্তিত হয় না। স্কালায় কনস্ট্যান্টস ডিফাইন করা হয় val কিওয়ার্ড দিয়ে। যেহেতু val কনস্ট্যান্টস ইমিউটেবল (immutable), একবার তাদের মান সেট করার পর আর পরিবর্তন করা যায় না। তবে, var কিওয়ার্ড দিয়ে মিউটেবল ভেরিয়েবল ডিফাইন করা যায় যা পরিবর্তিত হতে পারে।
২.১ ইমিউটেবল কনস্ট্যান্টস (Immutable Constants)
object ConstantsExample {
val pi: Double = 3.14159 // Immutable constant
val maxLimit: Int = 100 // Immutable constant
def main(args: Array[String]): Unit = {
println("Pi: " + pi)
println("Max Limit: " + maxLimit)
}
}এখানে:
piএবংmaxLimitহল ইমিউটেবল কনস্ট্যান্টস, যেগুলি একবার নির্ধারিত হওয়ার পর আর পরিবর্তন করা যাবে না।
২.২ সিস্টেম কনস্ট্যান্টস (System Constants)
স্কালায় কিছু সিস্টেম লেভেলের কনস্ট্যান্টও রয়েছে, যেমন Double.NaN, Double.PositiveInfinity, Double.NegativeInfinity, এবং Integer.MAX_VALUE ইত্যাদি।
object SystemConstants {
def main(args: Array[String]): Unit = {
println("NaN: " + Double.NaN)
println("Positive Infinity: " + Double.PositiveInfinity)
println("Negative Infinity: " + Double.NegativeInfinity)
println("Max Int: " + Integer.MAX_VALUE)
}
}এখানে:
Double.NaN,Double.PositiveInfinity,Double.NegativeInfinity, এবংInteger.MAX_VALUEসিস্টেম কনস্ট্যান্টস হিসেবে ব্যবহৃত হচ্ছে।
২.৩ কনস্ট্যান্ট এবং val vs var
val:valদিয়ে আপনি একটি কনস্ট্যান্ট ডিফাইন করতে পারেন, যার মান একবার সেট হওয়ার পর আর পরিবর্তিত হয় না। এটি ইমিউটেবল (immutable) ভেরিয়েবল।var:varদিয়ে আপনি একটি মিউটেবল ভেরিয়েবল ডিফাইন করতে পারেন, যার মান পরবর্তীতে পরিবর্তিত হতে পারে।
val constantValue: Int = 42 // Immutable
var mutableValue: Int = 25 // Mutableএখানে:
constantValueহল একটি কনস্ট্যান্ট যা একবার সেট হওয়ার পর পরিবর্তন করা যাবে না।mutableValueহল একটি মিউটেবল ভেরিয়েবল যার মান পরবর্তীতে পরিবর্তন করা যেতে পারে।
সারাংশ
- লিটারেলস (Literals) হল নির্দিষ্ট মান যেগুলি কোডে সরাসরি উল্লেখ করা হয়, যেমন নম্বর, স্ট্রিং, চর, বুলিয়ান ইত্যাদি।
- কনস্ট্যান্টস (Constants) হল এমন ভেরিয়েবল যার মান একবার সেট করার পর আর পরিবর্তিত হয় না, এবং এটি
valকিওয়ার্ড দিয়ে ডিফাইন করা হয়।
স্কালায় লিটারেলস এবং কনস্ট্যান্টস খুবই গুরুত্বপূর্ণ এবং প্রোগ্রাম লেখার সময় ডাটা নিরাপত্তা এবং কার্যকারিতা বাড়াতে সাহায্য করে।
স্কালা প্রোগ্রামিং ভাষায় ভ্যারিয়েবল দুটি ধরনের হয়: ইমিউটেবল (Immutable) এবং **মিউটেবল (Mutable)**। এগুলোর মধ্যে পার্থক্য এবং ব্যবহার স্কালার প্রোগ্রামিংয়ের মৌলিক ধারণাগুলির মধ্যে একটি। এখানে আপনি কীভাবে ইমিউটেবল এবং মিউটেবল ভ্যারিয়েবল ব্যবহার করতে পারেন এবং তাদের পার্থক্য কী তা সম্পর্কে বিস্তারিত আলোচনা করা হবে।
১. ইমিউটেবল ভ্যারিয়েবল (Immutable Variables)
ইমিউটেবল ভ্যারিয়েবল এমন একটি ভ্যারিয়েবল যার মান একবার অ্যাসাইন করার পর আর পরিবর্তন করা যায় না। স্কালায় ইমিউটেবল ভ্যারিয়েবল ঘোষণা করতে val কিওয়ার্ড ব্যবহার করা হয়। এই ধরনের ভ্যারিয়েবলগুলির মান পরিবর্তন করা সম্ভব নয়, এবং এটি কোডের নিরাপত্তা এবং সাইড-ইফেক্ট কমানোর জন্য উপকারী।
উদাহরণ:
object ImmutableVariableExample {
def main(args: Array[String]): Unit = {
val x = 10 // Immutable variable
println(x)
// Uncommenting the following line will result in a compile-time error
// x = 15 // Error: reassignment to val
}
}এখানে:
val x = 10: এটি একটি ইমিউটেবল ভ্যারিয়েবল যা একবার ১০ মান দিয়ে অ্যাসাইন করা হয়েছে এবং পরে তার মান পরিবর্তন করা যাবে না।x = 15: এই লাইনে পরিবর্তন করার চেষ্টা করলে কম্পাইল টাইমে এরর হবে।
ইমিউটেবল ভ্যারিয়েবল এর উপকারিতা:
- নিরাপত্তা: একবার একটি মান সেট হলে সেটি পরিবর্তন না হওয়ায় এটি কোডকে নিরাপদ করে তোলে।
- সাইড-ইফেক্ট কমানো: যখন একটি ভ্যারিয়েবল পরিবর্তনযোগ্য না হয়, তখন সাইড-ইফেক্ট কম হয় এবং ডিবাগিং সহজ হয়।
২. মিউটেবল ভ্যারিয়েবল (Mutable Variables)
মিউটেবল ভ্যারিয়েবল এমন একটি ভ্যারিয়েবল যার মান পরিবর্তন করা যায়। স্কালায় মিউটেবল ভ্যারিয়েবল ঘোষণা করতে var কিওয়ার্ড ব্যবহার করা হয়। মিউটেবল ভ্যারিয়েবলগুলো কোডে বেশি পরিবর্তনশীল এবং প্রোগ্রাম চলাকালীন তার মান পরিবর্তন করা সম্ভব।
উদাহরণ:
object MutableVariableExample {
def main(args: Array[String]): Unit = {
var y = 10 // Mutable variable
println(y)
y = 20 // Value of y can be changed
println(y)
}
}এখানে:
var y = 10: এটি একটি মিউটেবল ভ্যারিয়েবল যার মান ১০ দিয়ে শুরু করা হয়েছে।y = 20: এখানেyএর মান ২০ দিয়ে আপডেট করা হয়েছে, যেহেতু এটি একটি মিউটেবল ভ্যারিয়েবল।
মিউটেবল ভ্যারিয়েবল এর উপকারিতা:
- লচিলাত্ব: যখন কোনো ভ্যারিয়েবলের মান পরিবর্তন করতে হয়, তখন মিউটেবল ভ্যারিয়েবল ব্যবহার করা হয়।
- ডাইনামিক আচরণ: যদি প্রোগ্রামে কোনো ভ্যারিয়েবলের মান চলমান অবস্থায় পরিবর্তিত হতে হয়, তবে এটি মিউটেবল ভ্যারিয়েবল হওয়া উচিত।
৩. ইমিউটেবল এবং মিউটেবল ভ্যারিয়েবলের পার্থক্য
| বৈশিষ্ট্য | ইমিউটেবল ভ্যারিয়েবল (val) | মিউটেবল ভ্যারিয়েবল (var) |
|---|---|---|
| ভ্যারিয়েবলের মান পরিবর্তন | সম্ভব নয় | সম্ভব |
| ব্যবহার | সিস্টেমের নিরাপত্তা এবং নির্ভরযোগ্যতার জন্য ব্যবহৃত | যখন ডাটা পরিবর্তন করার প্রয়োজন হয় |
| সাইড-ইফেক্ট | কম সাইড-ইফেক্ট | বেশি সাইড-ইফেক্ট হতে পারে |
| ব্যবহার | যখন মানটি অপরিবর্তনীয় থাকতে হবে | যখন মান পরিবর্তন হতে পারে |
৪. কোডের মধ্যে ইমিউটেবল ও মিউটেবল ভ্যারিয়েবলের ব্যবহার
ইমিউটেবল ভ্যারিয়েবল ব্যবহার:
object ImmutableExample {
def main(args: Array[String]): Unit = {
val a = 100
val b = a + 50
println("a = " + a) // a = 100
println("b = " + b) // b = 150
}
}এখানে:
val a = 100: একবার অ্যাসাইন করা হয়েছে, তারপর এটির মান পরিবর্তন করা যাবে না।val b = a + 50: এখানেbএর মানaথেকে প্রাপ্ত মানের উপর ভিত্তি করে নির্ধারণ করা হয়েছে, কিন্তুaপরিবর্তনশীল নয়।
মিউটেবল ভ্যারিয়েবল ব্যবহার:
object MutableExample {
def main(args: Array[String]): Unit = {
var balance = 5000
println("Initial Balance: " + balance) // Initial Balance: 5000
balance = balance - 2000 // Balance updated
println("Updated Balance: " + balance) // Updated Balance: 3000
}
}এখানে:
var balance = 5000: এটি মিউটেবল ভ্যারিয়েবল, যার মান পরিবর্তন করা সম্ভব।balance = balance - 2000: ভ্যারিয়েবলের মান পরিবর্তন করা হচ্ছে।
সারাংশ
- ইমিউটেবল ভ্যারিয়েবল (
val): একবার মান সেট করার পর পরিবর্তন করা যায় না, যা কোডের নিরাপত্তা এবং নির্ভরযোগ্যতা নিশ্চিত করে। - মিউটেবল ভ্যারিয়েবল (
var): যার মান চলমান সময়ে পরিবর্তন করা যায়, যা ডাইনামিক কোড এবং ফাংশনের জন্য প্রয়োজনীয়।
স্কালায় যখন আপনি মান পরিবর্তন না করতে চান, তখন val ব্যবহার করবেন এবং যখন মান পরিবর্তন করতে চান তখন var ব্যবহার করবেন।
স্কালা প্রোগ্রামিং ভাষায় কন্ট্রোল স্ট্রাকচারগুলি খুবই শক্তিশালী এবং ব্যবহারকারী-বান্ধব। স্কালা কন্ট্রোল স্ট্রাকচারগুলি সাধারণভাবে ব্যবহৃত হয় যেমন if-else, match, for loop, এবং while loop। এখানে আমরা প্রতিটি কন্ট্রোল স্ট্রাকচারের বিস্তারিত আলোচনা করব এবং উদাহরণ দেব।
১. if-else (কন্ডিশনাল স্টেটমেন্ট)
if-else কন্ডিশনাল স্টেটমেন্ট ব্যবহার করে আপনি একটি শর্ত পরীক্ষা করে আলাদা কাজ করতে পারেন। এটি অন্য ভাষার মতোই কাজ করে।
উদাহরণ:
object IfElseExample {
def main(args: Array[String]): Unit = {
val number = 10
if (number > 0) {
println("Positive Number")
} else if (number < 0) {
println("Negative Number")
} else {
println("Zero")
}
}
}- if: প্রথম শর্ত চেক করবে, যদি শর্ত সঠিক হয় তবে সেটি রান করবে।
- else if: যদি প্রথম শর্ত ভুল হয় তবে পরবর্তী শর্ত চেক হবে।
- else: সব শর্ত ভুল হলে এটি রান করবে।
২. match (প্যাটার্ন ম্যাচিং)
স্কালায় match কেস স্টেটমেন্টের মতো কাজ করে, কিন্তু এটি অনেক বেশি শক্তিশালী এবং নমনীয়। আপনি একাধিক শর্ত পরীক্ষা করতে পারেন এবং বিভিন্ন প্যাটার্নের সাথে মিলিয়ে কাজ করতে পারেন।
উদাহরণ:
object MatchExample {
def main(args: Array[String]): Unit = {
val day = 3
day match {
case 1 => println("Monday")
case 2 => println("Tuesday")
case 3 => println("Wednesday")
case 4 => println("Thursday")
case 5 => println("Friday")
case 6 => println("Saturday")
case 7 => println("Sunday")
case _ => println("Invalid day")
}
}
}- match: একটি মানের উপর বিভিন্ন প্যাটার্ন পরীক্ষা করতে ব্যবহৃত হয়।
- case: প্রতিটি প্যাটার্নের জন্য একটি শর্ত নির্ধারণ করা হয়।
- _: ডিফল্ট কেস, যদি কোন কেসের সাথে মেলে না, তখন এটি রান করবে।
Match ব্যবহার করার আরেকটি উদাহরণ:
val number = 10
val result = number match {
case x if x % 2 == 0 => "Even"
case x if x % 2 != 0 => "Odd"
case _ => "Unknown"
}
println(result) // Output: Evenএখানে, if শর্তের মাধ্যমে প্যাটার্ন ম্যাচিং ব্যবহার করা হয়েছে।
৩. for (for loop)
স্কালার for loop সাধারণত রেঞ্জ বা কালেকশনের উপাদানগুলির উপর লুপ চালাতে ব্যবহৃত হয়। এটি স্কালার ফাংশনাল স্টাইলের লুপ যা অনেক শক্তিশালী।
উদাহরণ (রেঞ্জ ব্যবহার করে):
object ForLoopExample {
def main(args: Array[String]): Unit = {
for (i <- 1 to 5) {
println(i)
}
}
}- 1 to 5: ১ থেকে ৫ পর্যন্ত একটি রেঞ্জ।
- <-: লুপের চলমান মান নিয়ে আসে।
উদাহরণ (অবিচ্ছিন্নভাবে ফিল্টারিং এবং মান পরিবর্তন):
object ForLoopFilter {
def main(args: Array[String]): Unit = {
for (i <- 1 to 10 if i % 2 == 0) {
println(i)
}
}
}এখানে, শুধুমাত্র even numbers (যেগুলি ২ দিয়ে ভাগযোগ্য) প্রিন্ট হবে।
উদাহরণ (জোড়া তৈরি):
object ForLoopPairs {
def main(args: Array[String]): Unit = {
for (i <- 1 to 3; j <- 1 to 2) {
println(s"i = $i, j = $j")
}
}
}এখানে nested loop ব্যবহার করা হয়েছে, যা দুটি ভিন্ন রেঞ্জের উপর লুপ চালায়।
৪. while (while loop)
while loop স্কালায় একটি সাধারণ লুপ কন্ট্রোল স্ট্রাকচার যা নির্দিষ্ট শর্ত পূর্ণ না হওয়া পর্যন্ত চালানো হয়।
উদাহরণ:
object WhileLoopExample {
def main(args: Array[String]): Unit = {
var i = 1
while (i <= 5) {
println(i)
i += 1
}
}
}- while: শর্ত পর্যালোচনা করে, এবং যতক্ষণ শর্ত সত্য থাকবে ততক্ষণ পর্যন্ত লুপ চালিয়ে যাবে।
- i += 1:
iএর মান এক এক করে বাড়ানো হচ্ছে।
উদাহরণ (অনন্ত লুপ এবং ব্রেক):
object InfiniteLoop {
def main(args: Array[String]): Unit = {
var i = 1
while (true) {
println(i)
i += 1
if (i > 5) {
println("Breaking the loop!")
break
}
}
}
}এখানে, একটি infinite loop তৈরি করা হয়েছে এবং একটি শর্ত পূর্ণ হলে ব্রেক করা হচ্ছে।
সারাংশ
- if-else: শর্ত অনুযায়ী কোডের বিভিন্ন ব্লক নির্বাচন করে।
- match: জটিল শর্তাবলী বা মানের সাথে প্যাটার্ন ম্যাচিং করতে ব্যবহৃত হয়, এটি অনেক শক্তিশালী এবং লজিকাল।
- for loop: একটি রেঞ্জ বা কালেকশন এর উপাদানগুলির উপর লুপ চালাতে ব্যবহৃত হয়।
- while loop: শর্তসাপেক্ষে কোডের নির্দিষ্ট ব্লক পুনরায় চালাতে ব্যবহৃত হয়।
স্কালার কন্ট্রোল স্ট্রাকচারগুলি প্রোগ্রামিংয়ের কার্যকারিতা এবং কার্যক্ষমতা বৃদ্ধি করতে সহায়ক এবং এগুলির মাধ্যমে আপনি জটিল লজিক সহজে এবং সুন্দরভাবে লেখতে পারবেন।
Read more