Kotlin Bootcamp for Programmers 2: اصول اولیه Kotlin

این Codelab بخشی از دوره 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: عملگرهای عددی را کاوش کنید

  1. IntelliJ IDEA را باز کنید، اگر قبلاً باز نشده است.
  2. برای باز کردن Kotlin REPL، Tools > Kotlin > Kotlin REPL را انتخاب کنید.

همانند سایر زبان ها، کاتلین از + ، - ، * و / برای مثبت، منفی، زمان و تقسیم استفاده می کند. Kotlin همچنین از انواع مختلف اعداد مانند Int ، Long ، Double و Float پشتیبانی می کند.

  1. عبارات زیر را در 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.

  1. برخی از عبارات را با ترکیب های مختلف اعداد صحیح و اعشاری امتحان کنید.
6*50
⇒ res13: kotlin.Int = 300

6.0*50.0
⇒ res14: kotlin.Double = 300.0

6.0*50
⇒ res15: kotlin.Double = 300.0
  1. چند روش را با شماره تماس بگیرید. کاتلین اعداد را به صورت اولیه نگه می‌دارد، اما به شما امکان می‌دهد تا روش‌ها را بر روی اعداد فراخوانی کنید، انگار که آنها شی هستند.
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 اختصاص دهید. این به این دلیل است که تبدیل اعداد ضمنی یک منبع رایج خطا در برنامه ها است. همیشه می توانید مقادیر مختلف را با ریخته گری اختصاص دهید.

  1. برای دیدن برخی از کست های ممکن، یک متغیر از نوع Int در REPL تعریف کنید.
val i: Int = 6
  1. یک متغیر جدید ایجاد کنید، سپس نام متغیر نشان داده شده در بالا و به دنبال آن .to را وارد کنید.
val b1 = i.to

IntelliJ IDEA لیستی از تکمیل های ممکن را نمایش می دهد. این تکمیل خودکار برای متغیرها و اشیاء از هر نوع کار می کند.

  1. toByte() را از لیست انتخاب کنید، سپس متغیر را چاپ کنید.
val b1 = i.toByte()
println(b1)
⇒ 6
  1. یک مقدار 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
  1. برای تکالیفی که خطاها را برمی‌گردانند، در عوض آن‌ها را ارسال کنید.
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
  1. برای خوانایی بیشتر ثابت‌های عددی طولانی، کاتلین به شما اجازه می‌دهد که زیرخط‌ها را در اعداد قرار دهید، جایی که برای شما منطقی است. سعی کنید ثابت های عددی مختلف را وارد کنید.
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 ، می توانید مقداری را اختصاص دهید، سپس مقدار را در برنامه تغییر دهید.

  1. متغیرها را با استفاده از val و var تعریف کنید و سپس مقادیر جدیدی به آنها اختصاص دهید.
var fish = 1
fish = 2
val aquarium = 1
aquarium = 2
⇒ error: val cannot be reassigned

می توانید به fish یک مقدار اختصاص دهید، سپس یک مقدار جدید به آن اختصاص دهید، زیرا با var تعریف شده است. تلاش برای اختصاص یک مقدار جدید به aquarium خطا می دهد زیرا با val تعریف شده است.

زمانی که کامپایلر بتواند آن را از روی زمینه تشخیص دهد، نوع ذخیره شده در یک متغیر استنباط می شود. اگر بخواهید، همیشه می‌توانید نوع متغیر را با استفاده از علامت دو نقطه مشخص کنید.

  1. چند متغیر را تعریف کنید و نوع آن را به صراحت مشخص کنید.
var fish: Int = 12
var lakes: Double = 2.5

هنگامی که یک نوع توسط شما یا کامپایلر اختصاص داده شد، نمی توانید نوع را تغییر دهید یا با خطا مواجه می شوید.

مرحله 4: در مورد رشته ها بیاموزید

رشته‌ها در Kotlin تقریباً مانند رشته‌ها در هر زبان برنامه‌نویسی دیگری کار می‌کنند که از " برای رشته‌ها و ' برای کاراکترهای منفرد استفاده می‌کنند، و می‌توانید رشته‌ها را با عملگر + به هم متصل کنید. می‌توانید با ترکیب آنها با مقادیر، الگوهای رشته‌ای ایجاد کنید؛ نام variable $ جایگزین می‌شود. با متنی که مقدار را نشان می دهد.به این حالت درون یابی متغیر می گویند .

  1. یک قالب رشته ایجاد کنید.
val numberOfFish = 5
val numberOfPlants = 12
"I have $numberOfFish fish" + " and $numberOfPlants plants"
⇒ res20: kotlin.String = I have 5 fish and 12 plants
  1. یک الگوی رشته ای با یک عبارت در آن ایجاد کنید. مانند سایر زبان ها، مقدار می تواند نتیجه یک عبارت باشد. از پرانتزهای مجعد {} برای تعریف عبارت استفاده کنید.
"I have ${numberOfFish + numberOfPlants} fish and plants"
⇒ res21: kotlin.String = I have 17 fish and plants

در این کار با بولی ها و بررسی شرایط در زبان برنامه نویسی کاتلین آشنا می شوید. مانند سایر زبان ها، کاتلین دارای عملگرهای بولی و بولی مانند کوچکتر، مساوی، بزرگتر از و غیره است ( < , == , > , != , <= , >= ).

  1. یک عبارت if / else بنویسید.
val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {
    println("Good ratio!") 
} else {
    println("Unhealthy ratio")
}
⇒ Good ratio!
  1. محدوده ای را در دستور if امتحان کنید. در کاتلین، شرایطی که آزمایش می‌کنید می‌تواند از محدوده‌ها نیز استفاده کند.
val fish = 50
if (fish in 1..100) {
    println(fish)
}
⇒ 50
  1. یک if با چند حالت بنویسید. برای شرایط پیچیده تر، از logical و && و logical یا || استفاده کنید . مانند زبان های دیگر، می توانید با استفاده از other 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!
  1. دستور 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 باشند.

  1. یک Int را اعلام کرده و به آن null اختصاص دهید.
var rocks: Int = null
⇒ error: null can not be a value of a non-null type Int
  1. از عملگر علامت سوال، ? ، بعد از نوع نشان می دهد که یک متغیر می تواند null باشد. یک Int? و null را به آن اختصاص دهید.
var marbles: Int? = null

هنگامی که انواع داده های پیچیده دارید، مانند یک لیست:

  • شما می توانید اجازه دهید عناصر لیست خالی باشند.
  • شما می توانید اجازه دهید که لیست null باشد، اما اگر null نباشد، عناصر آن نمی توانند null باشند.
  • شما می توانید اجازه دهید هر دو لیست یا عناصر تهی باشند.

لیست ها و برخی دیگر از انواع داده های پیچیده در کار بعدی پوشش داده می شوند.

مرحله 2: در مورد ? و ?: اپراتورها

? null اپراتور، درد نوشتن بسیاری از عبارات if / else را از بین می برد.

  1. برای بررسی اینکه آیا متغیر fishFoodTreats null نیست یا نه، کدی به روش طولانی‌تر بنویسید. سپس آن متغیر را کاهش دهید.
var fishFoodTreats = 6
if (fishFoodTreats != null) {
    fishFoodTreats = fishFoodTreats.dec()
}
  1. اکنون به شیوه نوشتن کاتلین با استفاده از ? اپراتور.
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
  1. همچنین می توانید تست های تهی را با عملگر ?: زنجیره ای بزنید. به این مثال نگاه کنید:
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: لیست ها را تهیه کنید

لیست ها یک نوع اساسی در کاتلین هستند و شبیه لیست های زبان های دیگر هستند.

  1. فهرستی را با استفاده از listOf اعلام کرده و آن را چاپ کنید. این لیست قابل تغییر نیست.
val school = listOf("mackerel", "trout", "halibut")
println(school)
⇒ [mackerel, trout, halibut]
  1. فهرستی را اعلام کنید که با استفاده از mutableListOf قابل تغییر باشد. یک مورد را حذف کنید
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")
⇒ res36: kotlin.Boolean = true

متد remove() زمانی true را برمی گرداند که آیتم ارسال شده را با موفقیت حذف کند.

مرحله 2: ایجاد آرایه

مانند سایر زبان ها، کاتلین دارای آرایه است. برخلاف لیست‌های کاتلین که دارای نسخه‌های قابل تغییر و تغییر ناپذیر هستند، هیچ نسخه قابل تغییری از Array وجود ندارد. هنگامی که یک آرایه ایجاد می کنید، اندازه آن ثابت می شود. شما نمی توانید عناصر را اضافه یا حذف کنید، مگر با کپی کردن در یک آرایه جدید.

قوانین استفاده از val و var در آرایه ها مانند لیست ها است.

  1. آرایه ای از رشته ها را با استفاده از arrayOf کنید. از ابزار آرایه java.util.Arrays.toString() برای چاپ آن استفاده کنید.
val school = arrayOf("shark", "salmon", "minnow")
println(java.util.Arrays.toString(school))
⇒ [shark, salmon, minnow]
  1. آرایه ای که با arrayOf اعلام شده است، نوع مرتبط با عناصر ندارد، بنابراین می توانید انواع را ترکیب کنید، که مفید است. یک آرایه با انواع مختلف اعلام کنید.
val mix = arrayOf("fish", 2)
  1. همچنین می توانید آرایه هایی را با یک نوع برای همه عناصر اعلام کنید. یک آرایه از اعداد صحیح را با استفاده از intArrayOf() کنید. سازنده های مربوطه، یا توابع نمونه سازی، برای آرایه های انواع دیگر وجود دارد.
val numbers = intArrayOf(1,2,3)
  1. دو آرایه را با عملگر + ترکیب کنید.
val numbers = intArrayOf(1,2,3)
val numbers3 = intArrayOf(4,5,6)
val foo2 = numbers3 + numbers
println(foo2[5])
=> 3
  1. ترکیب های مختلفی از آرایه ها و لیست های تو در تو را امتحان کنید. مانند سایر زبان‌ها، می‌توانید آرایه‌ها و فهرست‌ها را تودرتو کنید. یعنی وقتی یک آرایه را در یک آرایه قرار می دهید، یک آرایه از آرایه ها دارید - نه آرایه ای مسطح از محتویات این دو. عناصر یک آرایه نیز می توانند لیست باشند و عناصر لیست ها می توانند آرایه باشند.
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 است. هنگامی که از ابزار آرایه برای چاپ آن استفاده نمی کنید، کاتلین آدرس را به جای محتویات آرایه چاپ می کند.

  1. یکی از ویژگی‌های خوب Kotlin این است که می‌توانید آرایه‌ها را به جای مقداردهی اولیه با کد، مقداردهی اولیه کنید. این مثال را امتحان کنید:
val array = Array (5) { it * 2 }
println(java.util.Arrays.toString(array))
⇒ [0, 2, 4, 6, 8]

کد اولیه بین پرانتزهای فرفری، {} است. در کد it شاخص آرایه اشاره دارد که با 0 شروع می شود.

مرحله 3: حلقه ها را ایجاد کنید

اکنون که لیست‌ها و آرایه‌ها را دارید، حلقه زدن بین عناصر همان‌طور که انتظار دارید کار می‌کند.

  1. یک آرایه ایجاد کنید. از یک حلقه for برای تکرار در آرایه و چاپ عناصر استفاده کنید.
val school = arrayOf("shark", "salmon", "minnow")
for (element in school) {
    print(element + " ")
}
⇒ shark salmon minnow
  1. در کاتلین، می توانید همزمان عناصر و شاخص ها را حلقه بزنید. این مثال را امتحان کنید:
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. اندازه ها و محدوده های مختلف گام را امتحان کنید. می توانید محدوده ای از اعداد یا نویسه ها را بر اساس حروف الفبا مشخص کنید. و مانند سایر زبان ها، لازم نیست 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
  1. چند حلقه را امتحان کنید. مانند سایر زبان‌ها، کاتلین دارای حلقه‌های 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 بهترین نقطه شروع شما است.

آموزش های کاتلین

وب‌سایت 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 متغیر نباید فوراً مقداردهی اولیه شوند.

به درس بعدی بروید: 3. توابع

برای یک نمای کلی از دوره، از جمله پیوندهایی به دیگر کدها، به «کوتلین بوت کمپ برای برنامه نویسان: به دوره خوش آمدید» مراجعه کنید.