این کد لبه بخشی از دوره Kotlin Bootcamp برای برنامه نویسان است. اگر به ترتیب روی کدها کار کنید، بیشترین ارزش را از این دوره خواهید گرفت. بسته به دانش خود، ممکن است بتوانید برخی از بخش ها را مرور کنید. این دوره مختص برنامه نویسانی است که یک زبان شی گرا را می دانند و می خواهند Kotlin را یاد بگیرند.
مقدمه
در این کد لبه، شما اصول اولیه زبان برنامه نویسی Kotlin را یاد می گیرید: انواع داده ها، عملگرها، متغیرها، ساختارهای کنترلی و متغیرهای nullable در مقابل nonnullable. این دوره مخصوص برنامه نویسانی است که زبان شی گرا را می دانند و می خواهند Kotlin را یاد بگیرند.
به جای ساختن یک برنامه نمونه واحد، درسهای این دوره برای ایجاد دانش شما طراحی شدهاند، اما نیمه مستقل از یکدیگر باشند تا بتوانید بخشهایی را که با آنها آشنا هستید، مرور کنید. برای گره زدن آنها به یکدیگر، بسیاری از نمونه ها از تم آکواریوم استفاده می کنند. و اگر می خواهید داستان کامل آکواریوم را ببینید، دوره Kotlin Bootcamp for Programmers Udacity را بررسی کنید.
آنچه از قبل باید بدانید
- نحوه ایجاد پروژه در IntelliJ IDEA
- نحوه باز کردن و اجرای کد در Kotlin's REPL (Read-Eval-Print Loop) در IntelliJ IDEA ( Tools > Kotlin > Kotlin REPL )
چیزی که یاد خواهید گرفت
- نحوه استفاده از انواع داده، عملگرها و متغیرهای Kotlin
- نحوه کار با بولی ها و شرایط
- تفاوت بین متغیرهای nullable و nonnullable
- نحوه کار آرایه ها، لیست ها و حلقه ها در Kotlin
کاری که خواهی کرد
- برای یادگیری اصول اولیه Kotlin با Kotlin REPL کار کنید
در این کار با عملگرها و انواع زبان برنامه نویسی کاتلین آشنا می شوید.
مرحله 1: عملگرهای عددی را کاوش کنید
- IntelliJ IDEA را باز کنید، اگر قبلاً باز نشده است.
- برای باز کردن Kotlin REPL، Tools > Kotlin > Kotlin REPL را انتخاب کنید.

همانند سایر زبانها، کاتلین + ، - ، * و / برای بعلاوه، منهای، زمانها و تقسیم استفاده میکند. Kotlin همچنین از انواع مختلف اعداد مانند Int ، Long ، Double و Float پشتیبانی می کند.
- عبارات زیر را در REPL وارد کنید. برای مشاهده نتیجه،
Control+Enter(Command+Enterدر مک) را بعد از هر کدام فشار دهید.
1+1 ⇒ res8: kotlin.Int = 2 53-3 ⇒ res9: kotlin.Int = 50 50/10 ⇒ res10: kotlin.Int = 5 1.0/2.0 ⇒ res11: kotlin.Double = 0.5 2.0*3.5 ⇒ res12: kotlin.Double = 7.0
توجه داشته باشید که نتایج عملیات انواع عملوندها را حفظ می کند، بنابراین 1/2 = 0، اما 1.0/2.0 = 0.5.
- برخی از عبارات را با ترکیب های مختلف اعداد صحیح و اعشاری امتحان کنید.
6*50 ⇒ res13: kotlin.Int = 300 6.0*50.0 ⇒ res14: kotlin.Double = 300.0 6.0*50 ⇒ res15: kotlin.Double = 300.0
- چند روش را با شماره تماس بگیرید. کاتلین اعداد را به صورت ابتدایی نگه میدارد، اما به شما امکان میدهد تا روشها را بر روی اعداد فراخوانی کنید، انگار که آنها شی هستند.
2.times(3) ⇒ res5: kotlin.Int = 6 3.5.plus(4) ⇒ res8: kotlin.Double = 7.5 2.4.div(2) ⇒ res9: kotlin.Double = 1.2
مرحله 2: استفاده از انواع را تمرین کنید
Kotlin به طور ضمنی بین انواع اعداد تبدیل نمیکند، بنابراین نمیتوانید یک مقدار کوتاه را مستقیماً به یک متغیر طولانی یا یک Byte به یک Int اختصاص دهید. این به این دلیل است که تبدیل اعداد ضمنی یک منبع رایج خطا در برنامه ها است. همیشه میتوانید مقادیر مختلف را با ریختهگری اختصاص دهید.
- برای دیدن برخی از بازیگران ممکن، یک متغیر از نوع
Intدر REPL تعریف کنید.
val i: Int = 6- یک متغیر جدید ایجاد کنید، سپس نام متغیر نشان داده شده در بالا و به دنبال آن
.toوارد کنید.
val b1 = i.to IntelliJ IDEA لیستی از تکمیل های ممکن را نمایش می دهد. این تکمیل خودکار برای متغیرها و اشیاء از هر نوع کار می کند. 
-
toByte()از لیست انتخاب کنید، سپس متغیر را چاپ کنید.
val b1 = i.toByte()
println(b1)⇒ 6
- یک مقدار
Byteبه متغیرهای انواع مختلف اختصاص دهید.
val b2: Byte = 1 // OK, literals are checked statically
println(b2)
⇒ 1
val i1: Int = b2
⇒ error: type mismatch: inferred type is Byte but Int was expected
val i2: String = b2
⇒ error: type mismatch: inferred type is Byte but String was expected
val i3: Double = b2
⇒ error: type mismatch: inferred type is Byte but Double was expected- برای تکالیفی که خطاها را برمیگردانند، در عوض آنها را ارسال کنید.
val i4: Int = b2.toInt() // OK!
println(i4)
⇒ 1
val i5: String = b2.toString()
println(i5)
⇒ 1
val i6: Double = b2.toDouble()
println(i6)
⇒ 1.0- برای خوانایی بیشتر ثابتهای عددی طولانی، کاتلین به شما اجازه میدهد تا در اعداد زیرخط قرار دهید، جایی که برای شما منطقی است. سعی کنید ثابت های عددی مختلف را وارد کنید.
val oneMillion = 1_000_000 val socialSecurityNumber = 999_99_9999L val hexBytes = 0xFF_EC_DE_5E val bytes = 0b11010010_01101001_10010100_10010010
مرحله 3: ارزش انواع متغیرها را یاد بگیرید
کاتلین از دو نوع متغیر پشتیبانی می کند: متغیر و غیر قابل تغییر. با val ، می توانید یک مقدار یک بار اختصاص دهید. اگر دوباره سعی کنید چیزی را اختصاص دهید، با خطا مواجه می شوید. با var ، می توانید یک مقدار را اختصاص دهید، سپس مقدار را در برنامه تغییر دهید.
- متغیرها را با استفاده از
valوvarتعریف کنید و سپس مقادیر جدیدی به آنها اختصاص دهید.
var fish = 1
fish = 2
val aquarium = 1
aquarium = 2⇒ error: val cannot be reassigned
می توانید به fish یک مقدار اختصاص دهید، سپس یک مقدار جدید به آن اختصاص دهید، زیرا با var تعریف شده است. تلاش برای اختصاص یک مقدار جدید به aquarium خطا می دهد زیرا با val تعریف شده است.
زمانی که کامپایلر بتواند آن را از روی زمینه تشخیص دهد، نوع ذخیره شده در یک متغیر استنباط می شود. اگر بخواهید، همیشه میتوانید نوع متغیر را با استفاده از علامت دو نقطه مشخص کنید.
- چند متغیر را تعریف کنید و نوع آن را به صراحت مشخص کنید.
var fish: Int = 12
var lakes: Double = 2.5هنگامی که یک نوع توسط شما یا کامپایلر اختصاص داده شد، نمی توانید نوع را تغییر دهید یا با خطا مواجه می شوید.
مرحله 4: در مورد رشته ها بیاموزید
رشتهها در Kotlin تقریباً مانند رشتهها در هر زبان برنامهنویسی دیگری با استفاده از " برای رشتهها و ' برای کاراکترهای منفرد کار میکنند، و میتوانید رشتهها را با عملگر + به هم متصل کنید. میتوانید با ترکیب آنها با مقادیر، الگوهای رشتهای ایجاد کنید؛ نام variable $ با متنی که مقدار را نشان میدهد جایگزین میشود. به این حالت درون یابی متغیر میگویند.
- یک قالب رشته ایجاد کنید.
val numberOfFish = 5
val numberOfPlants = 12
"I have $numberOfFish fish" + " and $numberOfPlants plants"⇒ res20: kotlin.String = I have 5 fish and 12 plants
- یک قالب رشته ای با یک عبارت در آن ایجاد کنید. مانند سایر زبان ها، مقدار می تواند نتیجه یک عبارت باشد. برای تعریف عبارت از پرانتزهای مجعد
{}استفاده کنید.
"I have ${numberOfFish + numberOfPlants} fish and plants"⇒ res21: kotlin.String = I have 17 fish and plants
در این کار با بولی ها و بررسی شرایط در زبان برنامه نویسی کاتلین آشنا می شوید. مانند زبان های دیگر، کاتلین دارای عملگرهای بولی و بولی مانند کوچکتر، مساوی، بزرگتر از و غیره است ( < , == , > , != , <= , >= ).
- یک عبارت
if/elseبنویسید.
val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {
println("Good ratio!")
} else {
println("Unhealthy ratio")
}⇒ Good ratio!
- محدوده ای را در دستور
ifامتحان کنید. در کاتلین، شرایطی که آزمایش میکنید میتواند از محدودهها نیز استفاده کند.
val fish = 50
if (fish in 1..100) {
println(fish)
}⇒ 50
- یک
ifبا چند حالت بنویسید. برای شرایط پیچیده تر، از logical و&&و logical یا||استفاده کنید . مانند زبان های دیگر، می توانید با استفاده ازelse ifچندین مورد داشته باشید.
if (numberOfFish == 0) {
println("Empty tank")
} else if (numberOfFish < 40) {
println("Got fish!")
} else {
println("That's a lot of fish!")
}⇒ That's a lot of fish!
- دستور
whenرا امتحان کنید. راه بهتری برای نوشتن این سری از دستوراتif/else if/elseدر Kotlin وجود دارد، با استفاده از دستورwhen، که مانند دستورswitchدر زبان های دیگر است. شرایط موجود در دستورwhenنیز می توانند از محدوده استفاده کنند.
when (numberOfFish) {
0 -> println("Empty tank")
in 1..39 -> println("Got fish!")
else -> println("That's a lot of fish!")
}⇒ That's a lot of fish!
در این کار، شما با متغیرهای nullable در مقابل nonnullable آشنا می شوید. خطاهای برنامه نویسی شامل null ها منبع باگ های بی شماری بوده است. کاتلین به دنبال کاهش باگ ها با معرفی متغیرهای غیر قابل تهی است.
مرحله 1: با پوچ بودن آشنا شوید
به طور پیش فرض، متغیرها نمی توانند null باشند.
- یک
Intاعلام کرده وnullرا به آن اختصاص دهید.
var rocks: Int = null⇒ error: null can not be a value of a non-null type Int
- از عملگر علامت سوال،
?، بعد از نوع نشان می دهد که یک متغیر می تواند null باشد. اعلامInt?وnullرا به آن اختصاص دهید.
var marbles: Int? = nullهنگامی که انواع داده های پیچیده دارید، مانند یک لیست:
- شما می توانید اجازه دهید عناصر لیست خالی باشند.
- شما می توانید اجازه دهید لیست تهی باشد، اما اگر تهی نباشد، عناصر آن نمی توانند null باشند.
- شما می توانید اجازه دهید هر دو لیست یا عناصر تهی باشند.
لیست ها و برخی دیگر از انواع داده های پیچیده در کار بعدی پوشش داده می شوند.
مرحله 2: در مورد ? و ?: اپراتورها
null ? اپراتور، درد نوشتن بسیاری از عبارات if / else را از بین می برد.
- برای بررسی اینکه آیا متغیر
fishFoodTreatsnullنیست یا نه، کدی به روش طولانیتر بنویسید. سپس آن متغیر را کاهش دهید.
var fishFoodTreats = 6
if (fishFoodTreats != null) {
fishFoodTreats = fishFoodTreats.dec()
}- اکنون به شیوه نوشتن کاتلین با استفاده از
?اپراتور
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()- همچنین می توانید تست های تهی را با عملگر
?:زنجیره ای بزنید. به این مثال نگاه کنید:
fishFoodTreats = fishFoodTreats?.dec() ?: 0این مخفف عبارت "اگر fishFoodTreats null نیست، آن را کاهش دهید و استفاده کنید؛ در غیر این صورت از مقدار بعد از ?: که 0 است استفاده کنید." اگر fishFoodTreats null باشد، ارزیابی متوقف می شود و متد dec() فراخوانی نمی شود.
نکته ای در مورد اشاره گرهای پوچ
اگر واقعاً NullPointerExceptions دوست دارید، Kotlin به شما اجازه می دهد آنها را نگه دارید. عملگر ادعای غیر تهی، !! (double-bang)، هر مقداری را به یک نوع غیر تهی تبدیل می کند و در صورت null بودن مقدار، یک استثنا ایجاد می کند.
val len = s!!.length // throws NullPointerException if s is nullدر این کار با آرایه ها و لیست ها آشنا می شوید و راه های مختلف ایجاد حلقه در زبان برنامه نویسی کاتلین را یاد می گیرید.
مرحله 1: لیست ها را تهیه کنید
لیست ها یک نوع اساسی در کاتلین هستند و شبیه لیست های زبان های دیگر هستند.
- لیستی را با استفاده از
listOfاعلام کنید و آن را چاپ کنید. این لیست قابل تغییر نیست.
val school = listOf("mackerel", "trout", "halibut")
println(school)⇒ [mackerel, trout, halibut]
- فهرستی را اعلام کنید که با استفاده از
mutableListOfقابل تغییر باشد. یک مورد را حذف کنید.
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")⇒ res36: kotlin.Boolean = true
متد remove() زمانی که آیتم ارسال شده را با موفقیت حذف کند true برمی گرداند.
مرحله 2: آرایه ها را ایجاد کنید
مانند سایر زبان ها، کاتلین دارای آرایه است. بر خلاف لیستها در Kotlin که دارای نسخههای قابل تغییر و تغییر ناپذیر هستند، هیچ نسخه قابل تغییری از Array وجود ندارد. هنگامی که یک آرایه ایجاد می کنید، اندازه آن ثابت می شود. شما نمی توانید عناصر را اضافه یا حذف کنید، مگر با کپی کردن در یک آرایه جدید.
قوانین استفاده از val و var برای آرایه ها مانند لیست ها است.
- آرایه ای از رشته ها را با استفاده از
arrayOfاعلام کنید. از ابزار آرایهjava.util.Arrays.toString()برای چاپ آن استفاده کنید.
val school = arrayOf("shark", "salmon", "minnow")
println(java.util.Arrays.toString(school))⇒ [shark, salmon, minnow]
- آرایهای که با
arrayOfاعلام شده است، نوع مرتبط با عناصر ندارد، بنابراین میتوانید انواع را ترکیب کنید، که مفید است. یک آرایه با انواع مختلف اعلام کنید.
val mix = arrayOf("fish", 2)- همچنین می توانید آرایه هایی را با یک نوع برای همه عناصر اعلام کنید. آرایه ای از اعداد صحیح را با استفاده از
intArrayOf()اعلام کنید. سازنده های مربوطه، یا توابع نمونه سازی، برای آرایه های انواع دیگر وجود دارد.
val numbers = intArrayOf(1,2,3)- دو آرایه را با عملگر
+ترکیب کنید.
val numbers = intArrayOf(1,2,3)
val numbers3 = intArrayOf(4,5,6)
val foo2 = numbers3 + numbers
println(foo2[5])=> 3
- ترکیب های مختلفی از آرایه ها و لیست های تو در تو را امتحان کنید. مانند سایر زبانها، میتوانید آرایهها و فهرستها را تودرتو کنید. یعنی وقتی یک آرایه را در یک آرایه قرار میدهید، یک آرایه از آرایهها دارید - نه آرایهای مسطح از محتویات این دو. عناصر یک آرایه نیز می توانند لیست باشند و عناصر لیست ها می توانند آرایه باشند.
val numbers = intArrayOf(1, 2, 3)
val oceans = listOf("Atlantic", "Pacific")
val oddList = listOf(numbers, oceans, "salmon")
println(oddList)⇒ [[I@89178b4, [Atlantic, Pacific], salmon]
اولین عنصر، numbers ، یک Array است. هنگامی که از ابزار آرایه برای چاپ آن استفاده نمی کنید، Kotlin آدرس را به جای محتوای آرایه چاپ می کند.
- یکی از ویژگیهای خوب Kotlin این است که میتوانید آرایهها را به جای مقداردهی اولیه با کد، مقداردهی اولیه کنید. این مثال را امتحان کنید:
val array = Array (5) { it * 2 }
println(java.util.Arrays.toString(array))⇒ [0, 2, 4, 6, 8]
کد اولیه بین پرانتزهای فرفری، {} است. در کد به شاخص آرایه اشاره it که با 0 شروع می شود.
مرحله 3: حلقه ها را ایجاد کنید
اکنون که لیستها و آرایهها را دارید، حلقه زدن عناصر آنطور که انتظار دارید کار میکند.
- یک آرایه ایجاد کنید. از یک حلقه
forبرای تکرار در آرایه و چاپ عناصر استفاده کنید.
val school = arrayOf("shark", "salmon", "minnow")
for (element in school) {
print(element + " ")
}⇒ shark salmon minnow
- در کاتلین، می توانید همزمان عناصر و شاخص ها را حلقه بزنید. این مثال را امتحان کنید:
for ((index, element) in school.withIndex()) {
println("Item at $index is $element\n")
}⇒ Item at 0 is shark Item at 1 is salmon Item at 2 is minnow
- اندازه ها و محدوده های مختلف گام را امتحان کنید. شما می توانید محدوده ای از اعداد یا نویسه ها را بر اساس حروف الفبا مشخص کنید. و مانند زبان های دیگر، لازم نیست 1 به جلو بروید. می توانید با استفاده از
downToبه عقب برگردید.
for (i in 1..5) print(i)
⇒ 12345
for (i in 5 downTo 1) print(i)
⇒ 54321
for (i in 3..6 step 2) print(i)
⇒ 35
for (i in 'd'..'g') print (i)
⇒ defg- چند حلقه را امتحان کنید. مانند سایر زبانها، کاتلین دارای حلقههای
while، حلقههایdo...whileو عملگرهای++و--است. کاتلین همچنین دارای حلقه هایrepeatاست.
var bubbles = 0
while (bubbles < 50) {
bubbles++
}
println("$bubbles bubbles in the water\n")
do {
bubbles--
} while (bubbles > 50)
println("$bubbles bubbles in the water\n")
repeat(2) {
println("A fish is swimming")
}⇒ 50 bubbles in the water 49 bubbles in the water A fish is swimmingA fish is swimming
کاتلین در مورد اصول اولیه مانند عملگرها، لیست ها و حلقه ها بسیار شبیه به زبان های دیگر است، اما تفاوت های مهمی وجود دارد.
ویژگی های زیر ممکن است در Kotlin با آنچه در زبان های دیگر به آن عادت دارید متفاوت باشد:
- انواع کاتلین را نمی توان به طور ضمنی تبدیل کرد - از ریخته گری استفاده کنید.
- متغیرهای اعلام شده با
valفقط یک بار قابل تخصیص هستند. - متغیرهای Kotlin به طور پیش فرض پوچ نیستند. استفاده کنید
?تا متغیرها باطل شوند. - با کاتلین، می توانید همزمان از طریق ایندکس و عناصر یک آرایه در یک حلقه
forحلقه بزنید.
ساختارهای برنامه نویسی Kotlin زیر شبیه سازه های دیگر زبان ها هستند:
- آرایه ها و لیست ها می توانند یک نوع واحد یا انواع ترکیبی داشته باشند.
- آرایه ها و لیست ها را می توان تودرتو کرد.
- می توانید حلقه هایی با
for,while,do/whileوrepeatایجاد کنید. - دستور
whenنسخه کاتلین از دستورswitchاست، اماwhenانعطاف پذیرتر است.
مستندات کاتلین
اگر در مورد هر موضوعی در این دوره اطلاعات بیشتری می خواهید، یا اگر گیر کرده اید، https://kotlinlang.org بهترین نقطه شروع شما است.
- تبدیل نوع صریح
- تعریف متغیرها
- قالب های رشته ای
- مقادیر ناتوان
- لیست ها
- آرایه ها
-
if،when،for،while -
?:(الویس) اپراتور -
!!اپراتور
آموزش های کاتلین
وبسایت https://try.kotlinlang.org شامل آموزشهای غنی به نام Kotlin Koans، یک مترجم مبتنی بر وب ، و مجموعه کاملی از مستندات مرجع با مثالها است.
دوره جسارت
برای مشاهده دوره Udacity در مورد این موضوع، به Kotlin Bootcamp for Programmers مراجعه کنید.
ایده IntelliJ
اسناد IntelliJ IDEA را می توان در وب سایت JetBrains یافت.
این بخش، تکالیف احتمالی را برای دانشآموزانی که در این آزمایشگاه کد به عنوان بخشی از دورهای که توسط یک مربی هدایت میشود، کار میکنند، فهرست میکند. این وظیفه مربی است که موارد زیر را انجام دهد:
- در صورت نیاز تکالیف را تعیین کنید.
- نحوه ارسال تکالیف را با دانش آموزان در میان بگذارید.
- تکالیف را نمره دهید.
مربیان میتوانند از این پیشنهادات به اندازهای که میخواهند استفاده کنند، و باید با خیال راحت هر تکلیف دیگری را که فکر میکنند مناسب است، محول کنند.
اگر به تنهایی از طریق این کدها کار می کنید، از این تکالیف برای آزمایش دانش خود استفاده کنید.
به این سوالات پاسخ دهید
سوال 1
کدام یک از موارد زیر لیست غیرقابل تغییر رشته ها را اعلام می کند؟
▢ val school = arrayOf("shark", "salmon", "minnow")
▢ var school = arrayOf("shark", "salmon", "minnow")
▢ val school = listOf("shark", "salmon", "minnow")
▢ val school = mutableListOf("shark", "salmon", "minnow")
سوال 2
خروجی کد زیر چه خواهد بود؟
for (i in 3..8 step 2) print(i)
▢ 345678
▢ 468
▢ 38
▢ 357
سوال 3
هدف از علامت سوال در این کد چیست؟
var rocks: Int? = 3
▢ نوع rocks متغیر ثابت نیست.
▢ rocks متغیر را می توان روی تهی تنظیم کرد.
▢ rocks متغیر را نمی توان روی تهی تنظیم کرد.
▢ rocks متغیر نباید فوراً مقداردهی اولیه شوند.
به درس بعدی بروید:
برای یک نمای کلی از دوره، از جمله پیوندهایی به دیگر کدها، به "کوتلین بوت کمپ برای برنامه نویسان: به دوره خوش آمدید" مراجعه کنید.