0Pricing
Kotlin Academy · Lekcja

Indeksowanie i invoke

get, set i invoke

Indeksowanie i invoke to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Operator indeksowania

Zdefiniowanie operator fun get pozwala odczytywać wartości za pomocą składni nawiasów kwadratowych: obj[i].

class Row(val cells: List<String>) {
    operator fun get(i: Int) = cells[i]
}

fun main() {
    val r = Row(listOf("a", "b", "c"))
    println(r[1])
}

Zapisywanie za pomocą set

operator fun set umożliwia przypisywanie wartości: obj[i] = value. Ostatni parametr jest wartością.

class Grid {
    private val data = IntArray(3)
    operator fun get(i: Int) = data[i]
    operator fun set(i: Int, value: Int) { data[i] = value }
}

fun main() {
    val g = Grid()
    g[0] = 42
    println(g[0])
}

Indeksowanie z wieloma argumentami

Funkcje get i set mogą przyjmować kilka indeksów, co doskonale sprawdza się w przypadku macierzy.

class Matrix {
    private val d = Array(2) { IntArray(2) }
    operator fun get(r: Int, c: Int) = d[r][c]
    operator fun set(r: Int, c: Int, v: Int) { d[r][c] = v }
}

fun main() {
    val m = Matrix()
    m[1, 1] = 9
    println(m[1, 1])
}

Indeksowanie kluczami innymi niż Int

Parametry indeksu mogą mieć dowolny typ, co umożliwia dostęp podobny do dostępu do mapy.

class Settings {
    private val map = mutableMapOf<String, String>()
    operator fun get(key: String) = map[key]
    operator fun set(key: String, value: String) { map[key] = value }
}

fun main() {
    val s = Settings()
    s["theme"] = "dark"
    println(s["theme"])
}

Operator invoke

Zdefiniowanie operator fun invoke pozwala wywoływać instancję tak jak funkcję: obj().

class Greeter(val name: String) {
    operator fun invoke() = "Hello, $name"
}

fun main() {
    val g = Greeter("Sam")
    println(g())
}

Invoke z argumentami

invoke może przyjmować parametry, dzięki czemu obiekt zachowuje się jak funkcja przyjmująca argumenty.

class Multiplier(val factor: Int) {
    operator fun invoke(x: Int) = x * factor
}

fun main() {
    val triple = Multiplier(3)
    println(triple(5))
}

Obiekty wywoływalne ze stanem

Ponieważ obiekt przechowuje stan, invoke może tworzyć konfigurowalne obiekty przypominające funkcje.

class Accumulator {
    var total = 0
    operator fun invoke(n: Int) { total += n }
}

fun main() {
    val acc = Accumulator()
    acc(5)
    acc(10)
    println(acc.total)
}

Wiele przeciążeń invoke

Można zadeklarować kilka przeciążeń invoke z różnymi parametrami.

class Printer {
    operator fun invoke(s: String) = println(s)
    operator fun invoke(n: Int) = println("num: $n")
}

fun main() {
    val p = Printer()
    p("hi")
    p(7)
}

Indeksowanie w wyrażeniach

Dostęp indeksowany naturalnie łączy się z innymi operacjami.

class Scores(private val list: List<Int>) {
    operator fun get(i: Int) = list[i]
}

fun main() {
    val s = Scores(listOf(10, 20, 30))
    println(s[0] + s[2])
}

Łączenie get i invoke

Typ może obsługiwać zarówno indeksowanie, jak i wywoływanie, zapewniając ekspresywny interfejs API.

class Lookup(private val data: Map<String, Int>) {
    operator fun get(key: String) = data[key]
    operator fun invoke() = data.size
}

fun main() {
    val l = Lookup(mapOf("a" to 1))
    println(l["a"])
    println(l())
}

Jak korzysta z tego biblioteka standardowa

Operatory list[i] typu List i map[key] typu Map są dokładnie tymi operatorami. Państwa typy również mogą działać równie naturalnie.

fun main() {
    val list = listOf(1, 2, 3)
    val map = mapOf("x" to 9)
    println(list[0])
    println(map["x"])
}

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat indeksowania i invoke.

Podsumowanie

Opanowali Państwo indeksowanie i invoke:

  • get obsługuje zapis obj[i], a set zapis obj[i] = v.
  • Operatory indeksowania obsługują wiele kluczy, nie tylko klucze typu Int.
  • invoke pozwala wywoływać instancje jak funkcje — z argumentami lub bez nich.
  • Standardowe kolekcje korzystają dokładnie z tych operatorów.
class Box {
    private val m = mutableMapOf<String, Int>()
    operator fun get(k: String) = m[k]
    operator fun set(k: String, v: Int) { m[k] = v }
}

fun main() {
    val b = Box()
    b["x"] = 5
    println(b["x"])
}

Często zadawane pytania

Czy lekcja „Indeksowanie i invoke” jest bezpłatna?

Tak — pełny tekst „Indeksowanie i invoke” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Indeksowanie i invoke”?

get, set i invoke Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Indeksowanie i invoke”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Funkcje operatorowe
  2. Operatory porównania
  3. Indeksowanie i invoke
  4. Najlepsze praktyki
← Powrót do Kotlin Academy