এই কোডল্যাবটি প্রোগ্রামারদের কোর্সের জন্য কোটলিন বুটক্যাম্পের অংশ। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ আপনার জ্ঞানের উপর নির্ভর করে, আপনি কিছু বিভাগ স্কিম করতে সক্ষম হতে পারেন। এই কোর্সটি এমন প্রোগ্রামারদের জন্য তৈরি যারা একটি অবজেক্ট-ওরিয়েন্টেড ভাষা জানেন এবং কোটলিন শিখতে চান।
ভূমিকা
এই কোডল্যাবে আপনাকে পেয়ার, সংগ্রহ এবং এক্সটেনশন ফাংশন সহ কোটলিনের বিভিন্ন দরকারী বৈশিষ্ট্যের সাথে পরিচিত করা হয়েছে।
একটি একক নমুনা অ্যাপ তৈরি করার পরিবর্তে, এই কোর্সের পাঠগুলি আপনার জ্ঞান তৈরি করার জন্য ডিজাইন করা হয়েছে, তবে একে অপরের থেকে আধা-স্বতন্ত্র থাকুন যাতে আপনি আপনার পরিচিত বিভাগগুলিকে স্কিম করতে পারেন। তাদের একসাথে বাঁধতে, অনেক উদাহরণ একটি অ্যাকোয়ারিয়াম থিম ব্যবহার করে। এবং আপনি যদি সম্পূর্ণ অ্যাকোয়ারিয়ামের গল্প দেখতে চান, তাহলে প্রোগ্রামারদের জন্য কোটলিন বুটক্যাম্প উদাসিটি কোর্সটি দেখুন।
আপনি ইতিমধ্যে কি জানা উচিত
- কোটলিন ফাংশন, ক্লাস এবং পদ্ধতির সিনট্যাক্স
- ইন্টেলিজে আইডিইএ-তে কোটলিনের আরইপিএল (রিড-ইভাল-প্রিন্ট লুপ) এর সাথে কীভাবে কাজ করবেন
- কিভাবে IntelliJ IDEA এ একটি নতুন ক্লাস তৈরি করবেন এবং একটি প্রোগ্রাম চালাবেন
আপনি কি শিখবেন
- জোড়া এবং ট্রিপল নিয়ে কিভাবে কাজ করবেন
- সংগ্রহ সম্পর্কে আরো
- সংজ্ঞায়িত এবং ধ্রুবক ব্যবহার
- এক্সটেনশন ফাংশন লেখা
আপনি কি করবেন
- REPL এ জোড়া, ট্রিপল এবং হ্যাশ ম্যাপ সম্পর্কে জানুন
- ধ্রুবক সংগঠিত করার বিভিন্ন উপায় শিখুন
- একটি এক্সটেনশন ফাংশন এবং একটি এক্সটেনশন বৈশিষ্ট্য লিখুন
এই টাস্কে, আপনি জোড়া এবং ট্রিপল এবং তাদের ধ্বংস করার বিষয়ে শিখবেন। পেয়ার এবং ট্রিপল হল 2 বা 3টি জেনেরিক আইটেমের জন্য প্রিমেড ডেটা ক্লাস। এটি, উদাহরণস্বরূপ, একটি ফাংশন একাধিক মান প্রদানের জন্য দরকারী হতে পারে।
ধরুন আপনার কাছে মাছের একটি List
আছে, এবং একটি ফাংশন isFreshWater()
মাছটি স্বাদুপানির বা লোনা জলের মাছ কিনা তা পরীক্ষা করার জন্য। List.partition()
দুটি তালিকা প্রদান করে, একটি আইটেম সহ যেখানে শর্ত true
, এবং অন্যটি আইটেমগুলির জন্য যেখানে শর্ত false
।
val twoLists = fish.partition { isFreshWater(it) }
println("freshwater: ${twoLists.first}")
println("saltwater: ${twoLists.second}")
ধাপ 1: কিছু জোড়া এবং ট্রিপল তৈরি করুন
- REPL খুলুন ( টুলস > কোটলিন > কোটলিন REPL )।
- একটি জোড়া তৈরি করুন, এটি কিসের জন্য ব্যবহৃত হয় তার সাথে সরঞ্জামের একটি অংশ যুক্ত করে, তারপর মানগুলি মুদ্রণ করুন। আপনি দুটি মানকে সংযুক্ত করে একটি অভিব্যক্তি তৈরি করে একটি জোড়া তৈরি করতে পারেন, যেমন দুটি স্ট্রিং,
to
সাথে কীওয়ার্ড, তারপর প্রতিটি মান উল্লেখ করতে.first
বা.second
ব্যবহার করে।
val equipment = "fish net" to "catching fish"
println("${equipment.first} used for ${equipment.second}")
⇒ fish net used for catching fish
- একটি ট্রিপল তৈরি করুন এবং
toString()
দিয়ে এটি মুদ্রণ করুন, তারপরtoList()
দিয়ে একটি তালিকায় রূপান্তর করুন। আপনি 3টি মান সহTriple()
ব্যবহার করে একটি ট্রিপল তৈরি করুন। প্রতিটি মান উল্লেখ করতে.first
,.second
এবং.third
ব্যবহার করুন৷
val numbers = Triple(6, 9, 42)
println(numbers.toString())
println(numbers.toList())
⇒ (6, 9, 42) [6, 9, 42]
উপরের উদাহরণগুলি জোড়া বা ট্রিপলের সমস্ত অংশের জন্য একই প্রকার ব্যবহার করে, তবে এটির প্রয়োজন নেই। অংশগুলি একটি স্ট্রিং, একটি সংখ্যা বা একটি তালিকা হতে পারে, উদাহরণস্বরূপ—এমনকি আরেকটি জোড়া বা ট্রিপল।
- একটি জোড়া তৈরি করুন যেখানে জোড়ার প্রথম অংশটি নিজেই একটি জোড়া।
val equipment2 = ("fish net" to "catching fish") to "equipment"
println("${equipment2.first} is ${equipment2.second}\n")
println("${equipment2.first.second}")
⇒ (fish net, catching fish) is equipment ⇒ catching fish
ধাপ 2: কিছু জোড়া এবং ট্রিপল ধ্বংস করুন
জোড়া এবং ত্রিপলকে তাদের অংশে বিভক্ত করাকে ডেস্ট্রাকচারিং বলে। যথোপযুক্ত সংখ্যক ভেরিয়েবলের জন্য জোড়া বা ট্রিপল বরাদ্দ করুন এবং কোটলিন ক্রমানুসারে প্রতিটি অংশের মান নির্ধারণ করবে।
- একটি জোড়া ধ্বংস করুন এবং মান মুদ্রণ করুন।
val equipment = "fish net" to "catching fish"
val (tool, use) = equipment
println("$tool is used for $use")
⇒ fish net is used for catching fish
- একটি ট্রিপল ধ্বংস করুন এবং মান মুদ্রণ করুন।
val numbers = Triple(6, 9, 42)
val (n1, n2, n3) = numbers
println("$n1 $n2 $n3")
⇒ 6 9 42
মনে রাখবেন যে জোড়া এবং ট্রিপল ধ্বংস করা ডেটা ক্লাসের মতোই কাজ করে, যা পূর্ববর্তী কোডল্যাবে আচ্ছাদিত ছিল।
এই টাস্কে আপনি তালিকা সহ সংগ্রহগুলি এবং একটি নতুন সংগ্রহের ধরন, হ্যাশ মানচিত্র সম্পর্কে আরও জানুন।
ধাপ 1: তালিকা সম্পর্কে আরও জানুন
- তালিকা এবং পরিবর্তনযোগ্য তালিকা পূর্ববর্তী পাঠে চালু করা হয়েছিল। এগুলি একটি খুব দরকারী ডেটা কাঠামো, তাই কোটলিন তালিকার জন্য বেশ কয়েকটি অন্তর্নির্মিত ফাংশন সরবরাহ করে। তালিকার জন্য ফাংশনের এই আংশিক তালিকাটি পর্যালোচনা করুন। আপনি
List
এবংMutableList
জন্য Kotlin ডকুমেন্টেশনে সম্পূর্ণ তালিকা খুঁজে পেতে পারেন।
ফাংশন | উদ্দেশ্য |
| পরিবর্তনযোগ্য তালিকায় একটি আইটেম যোগ করুন। |
| একটি পরিবর্তনযোগ্য তালিকা থেকে একটি আইটেম সরান. |
| বিপরীত ক্রমে উপাদান সহ তালিকার একটি অনুলিপি ফেরত দিন। |
| যদি তালিকায় আইটেমটি থাকে তবে |
| তালিকার অংশ ফেরত দিন, প্রথম সূচী থেকে শুরু করে দ্বিতীয় সূচকটি অন্তর্ভুক্ত নয়। |
- এখনও REPL-এ কাজ করছেন, নম্বরগুলির একটি তালিকা তৈরি করুন এবং এতে কল
sum()
করুন। এই সমস্ত উপাদান যোগফল.
val list = listOf(1, 5, 3, 4)
println(list.sum())
⇒ 13
- স্ট্রিংগুলির একটি তালিকা তৈরি করুন এবং তালিকাটি যোগ করুন।
val list2 = listOf("a", "bbb", "cc")
println(list2.sum())
⇒ error: none of the following functions can be called with the arguments supplied:
- যদি উপাদানটি এমন কিছু না হয় যে
List
সরাসরি কীভাবে যোগফল করতে জানে, যেমন একটি স্ট্রিং, আপনি একটি ল্যাম্বডা ফাংশন সহ.sumBy()
ব্যবহার করে এটিকে কীভাবে যোগ করতে হবে তা নির্দিষ্ট করতে পারেন, উদাহরণস্বরূপ, প্রতিটি স্ট্রিংয়ের দৈর্ঘ্য দ্বারা যোগফল। একটি ল্যাম্বডা আর্গুমেন্টের ডিফল্ট নামit
এবং এখানেit
তালিকার প্রতিটি উপাদানকে নির্দেশ করে কারণ তালিকাটি অতিক্রম করা হয়।
val list2 = listOf("a", "bbb", "cc")
println(list2.sumBy { it.length })
⇒ 6
- তালিকা দিয়ে আপনি আরও অনেক কিছু করতে পারেন। উপলব্ধ কার্যকারিতা দেখার একটি উপায় হল IntelliJ IDEA-তে একটি তালিকা তৈরি করা, ডট যোগ করা এবং তারপর টুলটিপে স্বয়ংক্রিয়-সম্পূর্ণতা তালিকাটি দেখুন। এটি যেকোনো বস্তুর জন্য কাজ করে। একটি তালিকা দিয়ে এটি চেষ্টা করুন.
- তালিকা থেকে
listIterator()
চয়ন করুন, তারপরfor
দিয়ে একটি তালিকা দিয়ে যান এবং স্পেস দ্বারা পৃথক করা সমস্ত উপাদান মুদ্রণ করুন।
val list2 = listOf("a", "bbb", "cc")
for (s in list2.listIterator()) {
println("$s ")
}
⇒ a bbb cc
ধাপ 2: হ্যাশ মানচিত্র ব্যবহার করে দেখুন
কোটলিনে, আপনি hashMapOf()
ব্যবহার করে অন্য যেকোন কিছুর সাথে অনেক কিছু ম্যাপ করতে পারেন। হ্যাশ মানচিত্রগুলি জোড়ার তালিকার মতো, যেখানে প্রথম মান একটি কী হিসাবে কাজ করে।
- একটি হ্যাশ মানচিত্র তৈরি করুন যা উপসর্গ, কী, এবং মাছের রোগ, মানগুলির সাথে মেলে।
val cures = hashMapOf("white spots" to "Ich", "red sores" to "hole disease")
- তারপর আপনি
get()
, বা এমনকি ছোট, বর্গাকার বন্ধনী[]
ব্যবহার করে উপসর্গ কী এর উপর ভিত্তি করে রোগের মান পুনরুদ্ধার করতে পারেন।
println(cures.get("white spots"))
⇒ Ich
println(cures["red sores"])
⇒ hole disease
- মানচিত্রে নেই এমন একটি উপসর্গ নির্দিষ্ট করার চেষ্টা করুন।
println(cures["scale loss"])
⇒ null
যদি একটি কী মানচিত্রে না থাকে, তাহলে ম্যাচিং রোগটি ফেরত দেওয়ার চেষ্টা করা null
হয়ে যায়। মানচিত্রের ডেটার উপর নির্ভর করে, সম্ভাব্য কী-এর জন্য কোনও মিল না থাকা সাধারণ হতে পারে। এই ধরনের ক্ষেত্রে, Kotlin getOrDefault()
ফাংশন প্রদান করে।
-
getOrDefault()
ব্যবহার করে কোনো মিল নেই এমন একটি কী খোঁজার চেষ্টা করুন।
println(cures.getOrDefault("bloating", "sorry, I don't know"))
⇒ sorry, I don't know
আপনি যদি একটি মান ফেরত দেওয়ার চেয়ে আরও বেশি কিছু করতে চান তবে Kotlin getOrElse()
ফাংশন প্রদান করে।
-
getOrDefault()
এর পরিবর্তেgetOrElse()
ব্যবহার করতে আপনার কোড পরিবর্তন করুন।
println(cures.getOrElse("bloating") {"No cure for this"})
⇒ No cure for this
একটি সাধারণ ডিফল্ট মান ফেরত দেওয়ার পরিবর্তে, কোঁকড়া ধনুর্বন্ধনী {}
মধ্যে যাই হোক না কেন কোডটি কার্যকর করা হয়। উদাহরণে, else
কেবল একটি স্ট্রিং প্রদান করে, তবে এটি একটি প্রতিকার সহ একটি ওয়েবপৃষ্ঠা খুঁজে বের করা এবং এটি ফেরত দেওয়ার মতো অভিনব হতে পারে।
ঠিক যেমন mutableListOf
, আপনিও একটি mutableMapOf
তৈরি করতে পারেন। একটি পরিবর্তনযোগ্য মানচিত্র আপনাকে আইটেম রাখতে এবং সরাতে দেয়। পরিবর্তনযোগ্য মানে পরিবর্তন করতে সক্ষম, অপরিবর্তনীয় মানে পরিবর্তন করতে অক্ষম।
- একটি ইনভেন্টরি ম্যাপ তৈরি করুন যা পরিবর্তন করা যেতে পারে, আইটেমের সংখ্যার সাথে একটি সরঞ্জামের স্ট্রিং ম্যাপ করুন। এটিতে একটি মাছের জাল দিয়ে এটি তৈরি করুন, তারপর
put()
দিয়ে ইনভেন্টরিতে 3টি ট্যাঙ্ক স্ক্রাবার যোগ করুন এবংremove()
দিয়ে মাছের জালটি সরিয়ে দিন।
val inventory = mutableMapOf("fish net" to 1)
inventory.put("tank scrubber", 3)
println(inventory.toString())
inventory.remove("fish net")
println(inventory.toString())
⇒ {fish net=1, tank scrubber=3}{tank scrubber=3}
এই টাস্কে, আপনি কোটলিনের ধ্রুবক এবং তাদের সংগঠিত করার বিভিন্ন উপায় সম্পর্কে শিখবেন।
ধাপ 1: কনস্ট বনাম ভ্যাল সম্পর্কে জানুন
- REPL-এ, একটি সংখ্যাসূচক ধ্রুবক তৈরি করার চেষ্টা করুন। কোটলিনে, আপনি শীর্ষ-স্তরের ধ্রুবক তৈরি করতে পারেন এবং
const val
ব্যবহার করে কম্পাইলের সময় তাদের একটি মান নির্ধারণ করতে পারেন।
const val rocks = 3
মানটি বরাদ্দ করা হয়েছে, এবং পরিবর্তন করা যাবে না, যা অনেকটা নিয়মিত val
ঘোষণা করার মতো শোনাচ্ছে। তাহলে const val
এবং val
মধ্যে পার্থক্য কী? const val
মান নির্ধারণ করা হয় কম্পাইলের সময়ে, যেখানে val
মান নির্ধারণ করা হয় প্রোগ্রাম এক্সিকিউশনের সময়, যার মানে, রান টাইমে একটি ফাংশন দ্বারা val
নির্ধারণ করা যেতে পারে।
তার মানে val
একটি ফাংশন থেকে একটি মান নির্ধারণ করা যেতে পারে, কিন্তু const val
পারে না।
val value1 = complexFunctionCall() // OK
const val CONSTANT1 = complexFunctionCall() // NOT ok
উপরন্তু, const val
শুধুমাত্র শীর্ষ স্তরে কাজ করে, এবং সিঙ্গলটন ক্লাসে object
দিয়ে ঘোষিত, নিয়মিত ক্লাসের সাথে নয়। আপনি শুধুমাত্র ধ্রুবক ধারণ করে এমন একটি ফাইল বা সিঙ্গলটন অবজেক্ট তৈরি করতে এটি ব্যবহার করতে পারেন এবং প্রয়োজনে সেগুলি আমদানি করতে পারেন।
object Constants {
const val CONSTANT2 = "object constant"
}
val foo = Constants.CONSTANT2
ধাপ 2: একটি সহচর বস্তু তৈরি করুন
কোটলিনের শ্রেণী স্তরের ধ্রুবকের ধারণা নেই।
একটি ক্লাসের মধ্যে ধ্রুবকগুলিকে সংজ্ঞায়িত করার জন্য, আপনাকে সেগুলিকে companion
কীওয়ার্ড দিয়ে ঘোষিত সহচর বস্তুগুলিতে মোড়ানো হবে। সঙ্গী বস্তুটি মূলত ক্লাসের মধ্যে একটি সিঙ্গলটন অবজেক্ট।
- একটি স্ট্রিং ধ্রুবক ধারণকারী একটি সহচর বস্তুর সাথে একটি ক্লাস তৈরি করুন।
class MyClass {
companion object {
const val CONSTANT3 = "constant in companion"
}
}
সহচর বস্তু এবং নিয়মিত বস্তুর মধ্যে মৌলিক পার্থক্য হল:
- কম্প্যানিয়ন অবজেক্টগুলিকে ধারণ করা ক্লাসের স্ট্যাটিক কনস্ট্রাক্টর থেকে শুরু করা হয়, অর্থাৎ, যখন অবজেক্ট তৈরি হয় তখন সেগুলি তৈরি হয়।
- নিয়মিত অবজেক্টগুলি সেই বস্তুর প্রথম অ্যাক্সেসে অলসভাবে শুরু করা হয়; যে, যখন তারা প্রথম ব্যবহার করা হয়.
আরও অনেক কিছু আছে, তবে আপনাকে এখন যা জানতে হবে তা হল ক্লাসে ধ্রুবকগুলিকে একটি সহচর বস্তুতে মোড়ানো।
এই টাস্কে, আপনি ক্লাসের আচরণ প্রসারিত সম্পর্কে শিখবেন। একটি ক্লাসের আচরণ প্রসারিত করার জন্য ইউটিলিটি ফাংশন লেখা খুবই সাধারণ। কোটলিন এই ইউটিলিটি ফাংশনগুলি ঘোষণা করার জন্য একটি সুবিধাজনক সিনট্যাক্স প্রদান করে: এক্সটেনশন ফাংশন।
এক্সটেনশন ফাংশন আপনাকে একটি বিদ্যমান ক্লাসে এর সোর্স কোড অ্যাক্সেস না করেই ফাংশন যোগ করতে দেয়। উদাহরণস্বরূপ, আপনি তাদের একটি Extensions.kt ফাইলে ঘোষণা করতে পারেন যা আপনার প্যাকেজের অংশ। এটি আসলে ক্লাসটি পরিবর্তন করে না, তবে এটি আপনাকে সেই ক্লাসের বস্তুতে ফাংশন কল করার সময় ডট-নোটেশন ব্যবহার করার অনুমতি দেয়।
ধাপ 1: একটি এক্সটেনশন ফাংশন লিখুন
- এখনও REPL-এ কাজ করছেন, একটি সাধারণ এক্সটেনশন ফাংশন লিখুন,
hasSpaces()
একটি স্ট্রিং স্পেস আছে কিনা তা পরীক্ষা করতে। ফাংশনের নামটি যে ক্লাসে কাজ করে তার সাথে প্রিফিক্স করা হয়। ফাংশনের ভিতরে,this
যে অবজেক্টে কল করা হয় তাকে বোঝায়, এবংit
find()
কলের পুনরাবৃত্তিকারীকে বোঝায়।
fun String.hasSpaces(): Boolean {
val found = this.find { it == ' ' }
return found != null
}
println("Does it have spaces?".hasSpaces())
⇒ true
- আপনি
hasSpaces()
ফাংশন সহজ করতে পারেন।this
স্পষ্টভাবে প্রয়োজন হয় না, এবং ফাংশনটি একটি একক অভিব্যক্তিতে কমিয়ে ফিরিয়ে দেওয়া যেতে পারে, তাই এর চারপাশে কোঁকড়া বন্ধনী{}
প্রয়োজন হয় না।
fun String.hasSpaces() = find { it == ' ' } != null
ধাপ 2: এক্সটেনশনের সীমাবদ্ধতা জানুন
এক্সটেনশন ফাংশন শুধুমাত্র তারা প্রসারিত করছেন ক্লাসের পাবলিক API অ্যাক্সেস আছে. private
যে ভেরিয়েবল অ্যাক্সেস করা যাবে না.
-
private
চিহ্নিত সম্পত্তিতে এক্সটেনশন ফাংশন যোগ করার চেষ্টা করুন।
class AquariumPlant(val color: String, private val size: Int)
fun AquariumPlant.isRed() = color == "red" // OK
fun AquariumPlant.isBig() = size > 50 // gives error
⇒ error: cannot access 'size': it is private in 'AquariumPlant'
- নীচের কোডটি পরীক্ষা করুন এবং এটি কী প্রিন্ট করবে তা বের করুন।
open class AquariumPlant(val color: String, private val size: Int)
class GreenLeafyPlant(size: Int) : AquariumPlant("green", size)
fun AquariumPlant.print() = println("AquariumPlant")
fun GreenLeafyPlant.print() = println("GreenLeafyPlant")
val plant = GreenLeafyPlant(size = 10)
plant.print()
println("\n")
val aquariumPlant: AquariumPlant = plant
aquariumPlant.print() // what will it print?
⇒ GreenLeafyPlant AquariumPlant
plant.print()
GreenLeafyPlant
প্রিন্ট করে। আপনি আশা করতে পারেন aquariumPlant.print()
GreenLeafyPlant
প্রিন্ট করবে, কারণ এটি plant
মান নির্ধারণ করা হয়েছিল। কিন্তু টাইপ কম্পাইল সময়ে সমাধান করা হয়, তাই AquariumPlant
মুদ্রিত হয়.
ধাপ 3: একটি এক্সটেনশন সম্পত্তি যোগ করুন
এক্সটেনশন ফাংশন ছাড়াও, কোটলিন আপনাকে এক্সটেনশন বৈশিষ্ট্য যোগ করতে দেয়। এক্সটেনশন ফাংশনগুলির মতো, আপনি যে ক্লাসটি প্রসারিত করছেন তা নির্দিষ্ট করুন, একটি বিন্দু দ্বারা অনুসরণ করুন এবং সম্পত্তির নাম অনুসরণ করুন৷
- এখনও REPL-এ কাজ করছেন,
AquariumPlant
এ একটি এক্সটেনশন প্রপার্টিisGreen
যোগ করুন, যদি রঙ সবুজ হয় তাহলে এটিtrue
।
val AquariumPlant.isGreen: Boolean
get() = color == "green"
একটি সাধারণ সম্পত্তির মতোই isGreen
সম্পত্তি অ্যাক্সেস করা যেতে পারে; যখন অ্যাক্সেস করা হয়, তখন isGreen
এর গেটারকে মান পেতে বলা হয়।
-
aquariumPlant
ভেরিয়েবলের জন্যisGreen
সম্পত্তি প্রিন্ট করুন এবং ফলাফলটি পর্যবেক্ষণ করুন।
aquariumPlant.isGreen
⇒ res4: kotlin.Boolean = true
ধাপ 4: বাতিলযোগ্য রিসিভার সম্পর্কে জানুন
আপনি যে ক্লাসটি প্রসারিত করেন তাকে রিসিভার বলা হয় এবং সেই ক্লাসটিকে বাতিল করা সম্ভব। যদি আপনি তা করেন, শরীরের মধ্যে ব্যবহৃত this
ভেরিয়েবলটি null
হতে পারে, তাই নিশ্চিত করুন যে আপনি এটির জন্য পরীক্ষা করেছেন। আপনি একটি বাতিলযোগ্য রিসিভার নিতে চাইবেন যদি আপনি আশা করেন যে কলকারীরা আপনার এক্সটেনশন পদ্ধতিকে নালযোগ্য ভেরিয়েবলে কল করতে চাইবে, অথবা যদি আপনার ফাংশনটি null
এ প্রয়োগ করা হয় তখন আপনি একটি ডিফল্ট আচরণ প্রদান করতে চান।
- এখনও REPL এ কাজ করছেন, একটি
pull()
পদ্ধতি সংজ্ঞায়িত করুন যা একটি বাতিলযোগ্য রিসিভার নেয়। এটি একটি প্রশ্ন চিহ্ন দিয়ে নির্দেশিত হয়?
টাইপের পরে, বিন্দুর আগে। শরীরের ভিতরে,this
-ডটnull
অ্যাপ্লাই?.apply.
fun AquariumPlant?.pull() {
this?.apply {
println("removing $this")
}
}
val plant: AquariumPlant? = null
plant.pull()
- এই ক্ষেত্রে, আপনি প্রোগ্রাম চালানোর সময় কোন আউটপুট নেই। কারণ
plant
null
, ভিতরেরprintln()
বলা হয় না।
এক্সটেনশন ফাংশনগুলি খুব শক্তিশালী, এবং বেশিরভাগ কোটলিন স্ট্যান্ডার্ড লাইব্রেরি এক্সটেনশন ফাংশন হিসাবে প্রয়োগ করা হয়।
এই পাঠে, আপনি সংগ্রহ সম্পর্কে আরও শিখেছেন, ধ্রুবক সম্পর্কে শিখেছেন এবং এক্সটেনশন ফাংশন এবং বৈশিষ্ট্যের শক্তির স্বাদ পেয়েছেন।
- একটি ফাংশন থেকে একাধিক মান ফেরাতে পেয়ার এবং ট্রিপল ব্যবহার করা যেতে পারে। যেমন:
val twoLists = fish.partition { isFreshWater(it) }
- Kotlin-এর
List
জন্য অনেক দরকারী ফাংশন আছে, যেমনreversed()
,contains()
, এবংsubList()
। - একটি
HashMap
মান কী ম্যাপ করতে ব্যবহার করা যেতে পারে। যেমন:
val cures = hashMapOf("white spots" to "Ich", "red sores" to "hole disease")
-
const
কীওয়ার্ড ব্যবহার করে কম্পাইল-টাইম কনস্ট্যান্ট ঘোষণা করুন। আপনি এগুলিকে শীর্ষ স্তরে রাখতে পারেন, সেগুলিকে একটি সিঙ্গলটন অবজেক্টে সংগঠিত করতে পারেন বা একটি সহচর বস্তুতে রাখতে পারেন৷ - একটি কম্প্যানিয়ন অবজেক্ট হল ক্লাস ডেফিনেশনের মধ্যে একটি সিঙ্গলটন অবজেক্ট, যা
companion
কীওয়ার্ড দিয়ে সংজ্ঞায়িত করা হয়। - এক্সটেনশন ফাংশন এবং বৈশিষ্ট্য একটি ক্লাসে কার্যকারিতা যোগ করতে পারে। যেমন:
fun String.hasSpaces() = find { it == ' ' } != null
- একটি বাতিলযোগ্য রিসিভার আপনাকে একটি ক্লাসে এক্সটেনশন তৈরি করতে দেয় যা
null
হতে পারে। দ্য?.
কোড এক্সিকিউট করার আগেnull
চেক করতে অপারেটরকেapply
সাথে যুক্ত করা যেতে পারে। যেমন:
this?.apply { println("removing $this") }
কোটলিন ডকুমেন্টেশন
আপনি যদি এই কোর্সে কোনো বিষয়ে আরও তথ্য চান, বা আপনি যদি আটকে যান, https://kotlinlang.org আপনার সেরা শুরুর পয়েন্ট।
কোটলিন টিউটোরিয়াল
https://try.kotlinlang.org ওয়েবসাইটটিতে Kotlin Koans নামে সমৃদ্ধ টিউটোরিয়াল রয়েছে, একটি ওয়েব-ভিত্তিক দোভাষী , এবং উদাহরণ সহ রেফারেন্স ডকুমেন্টেশনের একটি সম্পূর্ণ সেট।
উদ্যতা কোর্স
এই বিষয়ে Udacity কোর্সটি দেখতে, প্রোগ্রামারদের জন্য Kotlin Bootcamp দেখুন।
ইন্টেলিজ আইডিয়া
IntelliJ IDEA-এর জন্য ডকুমেন্টেশন জেটব্রেইন্স ওয়েবসাইটে পাওয়া যাবে।
এই বিভাগে একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্ট তালিকাভুক্ত করা হয়েছে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:
- প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
- শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
- হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.
প্রশিক্ষকরা এই পরামর্শগুলি যতটা কম বা যতটা চান ততটা ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।
আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলিকে নির্দ্বিধায় ব্যবহার করুন৷
এই প্রশ্নগুলোর উত্তর দাও
প্রশ্ন 1
নিচের কোনটি একটি তালিকার অনুলিপি প্রদান করে?
▢ add()
▢ remove()
▢ reversed()
▢ contains()
প্রশ্ন 2
class AquariumPlant(val color: String, val size: Int, private val cost: Double, val leafy: Boolean)
এই এক্সটেনশন ফাংশনগুলির মধ্যে কোনটি একটি কম্পাইলার ত্রুটি দেবে?
▢ fun AquariumPlant.isRed() = color == "red"
▢ fun AquariumPlant.isBig() = size > 45
▢ fun AquariumPlant.isExpensive() = cost > 10.00
▢ fun AquariumPlant.isNotLeafy() = leafy == false
প্রশ্ন 3
নিচের কোনটি এমন একটি জায়গা নয় যেখানে আপনি const val
দিয়ে ধ্রুবককে সংজ্ঞায়িত করতে পারেন?
▢ একটি ফাইলের শীর্ষ স্তরে
▢ নিয়মিত ক্লাসে
▢ সিঙ্গলটন বস্তুতে
▢ সহচর বস্তুতে
পরবর্তী পাঠে এগিয়ে যান:
অন্যান্য কোডল্যাবগুলির লিঙ্ক সহ কোর্সের একটি ওভারভিউয়ের জন্য, "প্রোগ্রামারদের জন্য কোটলিন বুটক্যাম্প: কোর্সে স্বাগতম" দেখুন।