این 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: عملگرهای عددی را کاوش کنید
- 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 یا||
استفاده کنید . مانند زبان های دیگر، می توانید با استفاده از otherelse 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 باشد، اما اگر null نباشد، عناصر آن نمی توانند null باشند.
- شما می توانید اجازه دهید هر دو لیست یا عناصر تهی باشند.
لیست ها و برخی دیگر از انواع داده های پیچیده در کار بعدی پوشش داده می شوند.
مرحله 2: در مورد ? و ?: اپراتورها
?
null
اپراتور، درد نوشتن بسیاری از عبارات if
/ else
را از بین می برد.
- برای بررسی اینکه آیا متغیر
fishFoodTreats
null
نیست یا نه، کدی به روش طولانیتر بنویسید. سپس آن متغیر را کاهش دهید.
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: ایجاد آرایه
مانند سایر زبان ها، کاتلین دارای آرایه است. برخلاف لیستهای کاتلین که دارای نسخههای قابل تغییر و تغییر ناپذیر هستند، هیچ نسخه قابل تغییری از 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 این است که میتوانید آرایهها را به جای مقداردهی اولیه با کد، مقداردهی اولیه کنید. این مثال را امتحان کنید:
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
متغیر نباید فوراً مقداردهی اولیه شوند.
به درس بعدی بروید:
برای یک نمای کلی از دوره، از جمله پیوندهایی به دیگر کدها، به «کوتلین بوت کمپ برای برنامه نویسان: به دوره خوش آمدید» مراجعه کنید.