3-bo‘lim
O'zgaruvchilar va turlar
val va var farqi, asosiy turlar, turni o'zi aniqlash, nega Kotlin turlarni yashirin almashtirmaydi va xavfsiz aylantirish.
Ushbu bo‘lim mundarijasi
Kotlin da o'zgaruvchi ikki so'zdan biri bilan e'lon qilinadi: val
yoki var. Farqi kichik ko'rinadi, lekin kod uslubini butunlay
belgilaydi.
val va var #
fun main() {
val ism = "Malika"
var yosh = 22
yosh = 23
println("$ism - $yosh")
}
Malika - 23
val- qiymat bir marta beriladi va keyin o'zgarmaydi.var- qiymatni qayta berish mumkin.
val ga qayta qiymat berishga urinsangiz, dastur kompilyatsiya
qilinmaydi:
val ism = "Malika"
ism = "Nodira" // error: val cannot be reassigned
Kotlin uslubi sodda: hamma narsani val qilib yozing, faqat
haqiqatan o'zgartirish kerak bo'lganda var ga o'tkazing.
Sababi amaliy: o'zgarmaydigan qiymat haqida o'ylash oson. Uni kim, qayerda o'zgartirgani haqida bosh qotirish kerak emas - u hech qayerda o'zgarmaydi.
Katta dasturda var lar soni qancha kam bo'lsa, xato ham shuncha
kam bo'ladi.
Asosiy turlar #
fun main() {
val butun: Int = 42
val katta: Long = 9_000_000_000
val kasr: Double = 3.14
val kichikKasr: Float = 2.5f
val rost: Boolean = true
val harf: Char = 'A'
val matn: String = "Namangan"
println("$butun $katta $kasr $kichikKasr")
println("$rost $harf $matn")
}
42 9000000000 3.14 2.5
true A Namangan
| Tur | Hajmi | Diapazon yoki misol |
|---|---|---|
Byte | 8 bit | -128 ... 127 |
Short | 16 bit | -32 768 ... 32 767 |
Int | 32 bit | taxminan ±2.1 milliard |
Long | 64 bit | juda katta |
Float | 32 bit | 2.5f |
Double | 64 bit | 3.14 |
Char | bitta belgi | 'A' - bir tirnoq |
Boolean | true / false | |
String | matn | "..." - qo'sh tirnoq |
Diqqat: Char uchun bir tirnoq, String uchun qo'sh tirnoq.
Ularni almashtirib yuborsangiz, kompilyator xato beradi.
Raqamlarni o'qishga qulay yozish #
fun main() {
val aholi = 37_500_000
val ikkilik = 0b1010
val onoltilik = 0xFF
println(aholi)
println(ikkilik)
println(onoltilik)
}
37500000
10
255
Pastki chiziq _ faqat ko'z uchun - kompilyator uni e'tiborsiz
qoldiradi.
Turni o'zi aniqlaydi #
fun main() {
val son = 42
val kasr = 2.5
val matn = "salom"
val rost = true
println(son::class.simpleName)
println(kasr::class.simpleName)
println(matn::class.simpleName)
println(rost::class.simpleName)
}
Int
Double
String
Boolean
Turni yozish shart emas - kompilyator uni boshlang'ich qiymatdan topadi. Bu tur chiqarish (type inference) deb ataladi.
Uch holatda:
- Boshlang'ich qiymat berilmaganda:
val ism: String - Kompilyator topganidan boshqa tur kerak bo'lganda:
val katta: Long = 5 - Ommaviy funksiya qaytaradigan tur - o'qiyotgan odam uchun.
Qolgan joyda yozmaslik odat tusiga kirgan.
Kotlin turlarni yashirin almashtirmaydi #
Bu Java dan kelganlar uchun eng kutilmagan joy:
val son: Int = 42
val katta: Long = son // error: type mismatch
Java da int dan long ga o'tish avtomatik. Kotlin da esa yo'q.
Aniq aytish kerak:
fun main() {
val son: Int = 42
val katta: Long = son.toLong()
val kasr: Double = son.toDouble()
val matn: String = son.toString()
println("$katta $kasr $matn")
println(katta::class.simpleName)
}
42 42.0 42
Long
| Metod | Nimaga aylantiradi |
|---|---|
toInt() | Int |
toLong() | Long |
toDouble() | Double |
toFloat() | Float |
toString() | String |
toChar() | Char |
Yashirin aylantirish qulay ko'rinadi, lekin u jim xatolarni tug'diradi:
val katta: Long = 3_000_000_000
val kichik: Int = katta.toInt()
Bu yerda qiymat Int ga sig'maydi va jim buziladi. Kotlin sizni
toInt() yozishga majburlaydi - shunda "men bu yerda ma'lumot
yo'qotishim mumkinligini bilaman" degan bo'lasiz.
Aniq yozilgan kod - kamroq kutilmagan xato.
Butun sonlarni bo'lish #
fun main() {
val a = 17
val b = 5
println(a / b)
println(a % b)
println(a.toDouble() / b)
println(17.0 / 5)
}
3
2
3.4
3.4
Ikkala son ham Int bo'lsa, / butun natija beradi - kasr qismi
tashlanadi. Kasr kerak bo'lsa, kamida bittasini Double qiling.
To'lib ketish #
fun main() {
val eng = Int.MAX_VALUE
println(eng)
println(eng + 1)
println(Int.MIN_VALUE)
println(Long.MAX_VALUE)
}
2147483647
-2147483648
-2147483648
9223372036854775807
Int.MAX_VALUE + 1 natijasi eng kichik songa aylanib ketdi -
hech qanday ogohlantirish chiqmadi.
Bu xatoni topish juda qiyin, chunki dastur ishlashda davom etadi va faqat natija noto'g'ri bo'ladi.
Katta sonlar bilan ishlayotgan bo'lsangiz - Long ishlating. Pul
yoki juda katta hisob-kitob uchun esa java.math.BigDecimal va
BigInteger bor.
Kasr sonlarning aniqligi #
fun main() {
println(0.1 + 0.2)
println(0.1 + 0.2 == 0.3)
val farq = Math.abs((0.1 + 0.2) - 0.3)
println(farq < 0.000001)
}
0.30000000000000004
false
true
Double ikkilik kasrlar bilan ishlaydi va 0.1 ni aniq saqlay
olmaydi. Shuning uchun kasr sonlarni == bilan solishtirmang -
farqni chegara bilan tekshiring.
Pul uchun esa BigDecimal:
import java.math.BigDecimal
fun main() {
val a = BigDecimal("0.1")
val b = BigDecimal("0.2")
println(a + b)
println(a + b == BigDecimal("0.3"))
}
0.3
true
Diqqat: BigDecimal("0.1") - satrdan yaratildi.
BigDecimal(0.1) deb sondan yaratsangiz, xatolik saqlanib qoladi.
O'zgarmaslar #
const val PI = 3.14159
const val SHAHAR = "Namangan"
fun main() {
println(PI)
println(SHAHAR)
}
3.14159
Namangan
const val - kompilyatsiya paytida ma'lum bo'lgan qiymat. U faqat
funksiya tashqarisida e'lon qilinadi va faqat oddiy turlar hamda
String bo'lishi mumkin.
val | const val | |
|---|---|---|
| Qiymat qachon ma'lum | Ishlash paytida | Kompilyatsiya paytida |
| Funksiya ichida bo'ladimi | Ha | Yo'q |
| Qanday turlar | Har qanday | Oddiy turlar va String |
Xavfsiz aylantirish #
Foydalanuvchi kiritgan matnni songa aylantirish kerak bo'lsa:
fun main() {
val togri = "456".toIntOrNull()
val notogri = "salom".toIntOrNull()
println(togri)
println(notogri)
println(notogri ?: 0)
println("12.5".toDoubleOrNull())
println("12abc".toIntOrNull())
}
456
null
0
12.5
null
toIntOrNull() xato bermaydi - u shunchaki null qaytaradi.
toInt() esa dasturni to'xtatadi.
Klaviaturadan yoki fayldan kelgan ma'lumot uchun toInt() emas,
toIntOrNull() yozing.
?: belgisi esa "null bo'lsa, buni ol" degani - uni 8-bo'limda
batafsil ko'ramiz.
- O'z ismingiz va yoshingizni
valvavarbilan e'lon qiling. valga qayta qiymat berib, xato matnini yozib oling.- Har bir asosiy turdan bittadan o'zgaruvchi yarating.
37_500_000va37500000bir xil ekanini tekshiring.IntniLongga yashirin o'tkazishga urinib ko'ring.17 / 5va17.0 / 5farqini ko'rsating.Int.MAX_VALUE + 1natijasini taxmin qiling, keyin tekshiring.0.1 + 0.2 == 0.3niDoublevaBigDecimalda solishtiring.const valni funksiya ichida e'lon qilib ko'ring."abc".toIntOrNull()va"abc".toInt()farqini sinang.
Xulosa #
valo'zgarmaydi,varo'zgaradi - doimvaldan boshlang.- Tur odatda yozilmaydi: kompilyator uni qiymatdan o'zi topadi.
- Kotlin turlarni yashirin almashtirmaydi -
toLong(),toDouble()kabi metodlarni aniq yozish kerak. - Ikkala son
Intbo'lsa,/butun natija beradi. - To'lib ketish xato bermaydi, qiymat aylanib ketadi.
Doubleni==bilan solishtirmang; pul uchunBigDecimalva uni satrdan yarating.const val- kompilyatsiya paytida ma'lum bo'lgan doimiy.- Matnni songa aylantirishda
toIntOrNull().
Keyingi bo'limda satrlar bilan ishlaymiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.