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.

🕑 16 daqiqa o‘qish 📄 828 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. val va var
  2. Asosiy turlar
  3. Raqamlarni o'qishga qulay yozish
  4. Turni o'zi aniqlaydi
  5. Kotlin turlarni yashirin almashtirmaydi
  6. Butun sonlarni bo'lish
  7. To'lib ketish
  8. Kasr sonlarning aniqligi
  9. O'zgarmaslar
  10. Xavfsiz aylantirish
  11. Xulosa

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 #

KOTLIN
fun main() {
    val ism = "Malika"
    var yosh = 22

    yosh = 23
    println("$ism - $yosh")
}
Natija
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:

KOTLIN
val ism = "Malika"
ism = "Nodira"    // error: val cannot be reassigned
Doim val dan boshlang

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 #

KOTLIN
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")
}
Natija
42 9000000000 3.14 2.5
true A Namangan
TurHajmiDiapazon yoki misol
Byte8 bit-128 ... 127
Short16 bit-32 768 ... 32 767
Int32 bittaxminan ±2.1 milliard
Long64 bitjuda katta
Float32 bit2.5f
Double64 bit3.14
Charbitta belgi'A' - bir tirnoq
Booleantrue / false
Stringmatn"..." - qo'sh tirnoq

Diqqat: Char uchun bir tirnoq, String uchun qo'sh tirnoq. Ularni almashtirib yuborsangiz, kompilyator xato beradi.

Raqamlarni o'qishga qulay yozish #

KOTLIN
fun main() {
    val aholi = 37_500_000
    val ikkilik = 0b1010
    val onoltilik = 0xFF

    println(aholi)
    println(ikkilik)
    println(onoltilik)
}
Natija
37500000
10
255

Pastki chiziq _ faqat ko'z uchun - kompilyator uni e'tiborsiz qoldiradi.

Turni o'zi aniqlaydi #

KOTLIN
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)
}
Natija
Int
Double
String
Boolean

Turni yozish shart emas - kompilyator uni boshlang'ich qiymatdan topadi. Bu tur chiqarish (type inference) deb ataladi.

Qachon turni yozish kerak

Uch holatda:

  1. Boshlang'ich qiymat berilmaganda: val ism: String
  2. Kompilyator topganidan boshqa tur kerak bo'lganda: val katta: Long = 5
  3. 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:

KOTLIN
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:

KOTLIN
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)
}
Natija
42 42.0 42
Long
MetodNimaga aylantiradi
toInt()Int
toLong()Long
toDouble()Double
toFloat()Float
toString()String
toChar()Char
Nega bunday qat'iylik

Yashirin aylantirish qulay ko'rinadi, lekin u jim xatolarni tug'diradi:

KOTLIN
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 #

KOTLIN
fun main() {
    val a = 17
    val b = 5

    println(a / b)
    println(a % b)
    println(a.toDouble() / b)
    println(17.0 / 5)
}
Natija
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 #

KOTLIN
fun main() {
    val eng = Int.MAX_VALUE
    println(eng)
    println(eng + 1)

    println(Int.MIN_VALUE)
    println(Long.MAX_VALUE)
}
Natija
2147483647
-2147483648
-2147483648
9223372036854775807
To'lib ketish xato bermaydi

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 #

KOTLIN
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)
}
Natija
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:

KOTLIN
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"))
}
Natija
0.3
true

Diqqat: BigDecimal("0.1") - satrdan yaratildi. BigDecimal(0.1) deb sondan yaratsangiz, xatolik saqlanib qoladi.

O'zgarmaslar #

KOTLIN
const val PI = 3.14159
const val SHAHAR = "Namangan"

fun main() {
    println(PI)
    println(SHAHAR)
}
Natija
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.

valconst val
Qiymat qachon ma'lumIshlash paytidaKompilyatsiya paytida
Funksiya ichida bo'ladimiHaYo'q
Qanday turlarHar qandayOddiy turlar va String

Xavfsiz aylantirish #

Foydalanuvchi kiritgan matnni songa aylantirish kerak bo'lsa:

KOTLIN
fun main() {
    val togri = "456".toIntOrNull()
    val notogri = "salom".toIntOrNull()

    println(togri)
    println(notogri)
    println(notogri ?: 0)

    println("12.5".toDoubleOrNull())
    println("12abc".toIntOrNull())
}
Natija
456
null
0
12.5
null

toIntOrNull() xato bermaydi - u shunchaki null qaytaradi. toInt() esa dasturni to'xtatadi.

Doim OrNull shaklini ishlating

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.

Amaliy topshiriq
  1. O'z ismingiz va yoshingizni val va var bilan e'lon qiling.
  2. val ga qayta qiymat berib, xato matnini yozib oling.
  3. Har bir asosiy turdan bittadan o'zgaruvchi yarating.
  4. 37_500_000 va 37500000 bir xil ekanini tekshiring.
  5. Int ni Long ga yashirin o'tkazishga urinib ko'ring.
  6. 17 / 5 va 17.0 / 5 farqini ko'rsating.
  7. Int.MAX_VALUE + 1 natijasini taxmin qiling, keyin tekshiring.
  8. 0.1 + 0.2 == 0.3 ni Double va BigDecimal da solishtiring.
  9. const val ni funksiya ichida e'lon qilib ko'ring.
  10. "abc".toIntOrNull() va "abc".toInt() farqini sinang.

Xulosa #

  • val o'zgarmaydi, var o'zgaradi - doim val dan boshlang.
  • Tur odatda yozilmaydi: kompilyator uni qiymatdan o'zi topadi.
  • Kotlin turlarni yashirin almashtirmaydi - toLong(), toDouble() kabi metodlarni aniq yozish kerak.
  • Ikkala son Int bo'lsa, / butun natija beradi.
  • To'lib ketish xato bermaydi, qiymat aylanib ketadi.
  • Double ni == bilan solishtirmang; pul uchun BigDecimal va uni satrdan yarating.
  • const val - kompilyatsiya paytida ma'lum bo'lgan doimiy.
  • Matnni songa aylantirishda toIntOrNull().

Keyingi bo'limda satrlar bilan ishlaymiz.

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.