Серодовища розробки (IDE) Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints тут. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне.
Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати тут
Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном.
Змінні Оголошення змінних Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only).
var x=5 //оголошення цілочисельної змінної val y=5 //оголошення val змінної var num: Int // оголошення цілочисельної змінної з прямим вказанням типу var isVar= true // створення змінної типу Boolean var hugeNumber = 6L //створення змінної типу Long var letter='D' //змінна типу Char var name="Tom" // змінна типу String var x=3.14 // змінна типу Double Можна при оголошенні змінної зразу вказати її тип: var name:String="Tom" // змінна типу String var hugeNumber2: Long =6 // змінна типу Long Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п.
Типи змінних Цілочисельні типи представлені типами Byte, Short, Int та Long. Тип Біт Діапазон значень Byte 8 біт -128 до 127 Short 16 біт –32768 до 32767 Int 32 біт –2147483648 до 2147483647 Long 64 біт -9 223 372 036 854 775 808 () до 9 223 372 036 854 775 807 ( - 1)
Дробові числа представлені типами Float (32 біта) та типом Double (64 біта).
Для представлення символів використовується тип Char. var letter='D' // символи вводяться в одинарних лапках Для представлення рядків використовується тип String. var name ="John" Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String.
Як і в іших мовах для використання спеціальних символів використовується \ (backslash). var apostrophe= '\'' //використовуємо одинарну лапку/апостроф var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n println (myString)
Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці: var myString=""" Ви ввели\n поможіть бо я заплутався """ println (myString)
Boolean змінні застосовуються для значень true або false. var isMan = true
Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong): var x:UInt=5u; Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа: var x:Int=5_500_000 // ніякої помилки, все правильно
Перетворення типів Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній). var k=65 // створиться змінна типу Int var l:Long = k.toLong() //до типу Long
Коментарі У Kotlin є три види коментарів: //однорядковий коментар //новий коментар
/* багаторядковий коментар */
/** * KDoc коментар * для документування функцій * та класів */ Тобто однорядкові коментарі починаються з двох косих рисок //. Багаторядкові вміщуються в символи /* та */. Все, що в цих символах, компілятор не сприймає як код.
Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції: /** * Ця функція обчислює суму двох цілих чисел. * @param a Перше ціле число. * @param b Друге ціле число. * @return Сума a та b. */ fun addNumbers(a: Int, b: Int): Int { return a + b } Детальніші про функції далі, у відповідному підрозділі.
Привіт Світе! Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java. fun main(args: Array<String>){ // вказання аргументів функції необов'язкове val message="Привіт, Світе!" println (message) // якщо виводимо лише значення змінної pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок println("Ми говоримо знову: "+message) // можна й так }
Зверніть увагу, що для вставляння змінної в рядок використовується знак $ Читання з консолі Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln(): println ("Введіть своє ім'я:") val name=readln() // читаємо ім'я (тип String) println ("Скільки вам років:") val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int) println("Привіт $name ($age)")
Конкатенація Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості: println("Hello"+" Igor") // так працює, виведе два слова println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз: println("hello "+(2+5)) // виведе: hello 7 Другий спосіб - поставити на початку порожній текстовий рядок: println(""+(2+5)+" hello")// виведе: 7 hello Конкатенацію можна використовувати не тільки у функції println(): val text:String=""+(5+4)+" Hello" //так теж можна Константи на рівні компіляції Перед ключовим словом val можна використати ключове слово const. В такому разі значення константи буде підставлятися в код під час компіляції: const val MY_CONST=55 fun main(){ println (MY_CONST) } Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п.
null безпечність В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор ?: val name: String? = null Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор !!:
Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати аварійне завершення програми (виняток), коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка.
Можна з допомогою ? здійснити так званий безпечний виклик. val name: String? = null val length: Int? = name?.length В цьому разі програме провіряє змінну name на значення null і, якщо null, то змінній length буде присвоєно теж null і не буде обчислена довжина рядка.
Таким чином наш null передався далі, але рано чи пізно нам буде необхідна перевірка змінної на null і якщо null, то здійснити якісь дії. Наприклад, можна присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "Умовні конструкції"), або оператор ?: (так званий "елвіс оператор"):
val name: String? = null // 'name' є nullable String val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість" println(displayName) //вивід: Гість
val nameNotNull: String? = "Іван" val displayNameNotNull: String = nameNotNull ?: "Гість" println(displayNameNotNull) // Вивід: Іван Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так val number=readln().toInt(), то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією (винятком). Ми можемо використати функцію toIntOrNull(), тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії: fun main(){ println("Введіть ціле число:") val number:Int?=readln().toIntOrNull() if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число" println("Ви ввели: не число") else // в іншому випадку виводимо наше число println("Ви ввели: $number") }
Елвіс оператор може бути більш функціональним. Так, якщо необхідно виконати якийсь код при null значенні, можна написати так: val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: run{ println("Неправильний логін") "Гість"
println("Логін:"+displayNameNotNull)
Останній рядок в run присвоюється змінній, яка перевірялась.
Можна просто завершити виконання функції main() або будь-якої функції використавши ключове слово return fun main(args: Array<String>) { val nameNotNull: String? = null val displayNameNotNull: String = nameNotNull ?: return println(displayNameNotNull)
} В даному випадку на екран нічого не буде виведено, оскільки після return функція main() завершується, а отже програма закінчує виконання.