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:
getobsługuje zapisobj[i], asetzapisobj[i] = v.- Operatory indeksowania obsługują wiele kluczy, nie tylko klucze typu Int.
invokepozwala 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
- Funkcje operatorowe
- Operatory porównania
- Indeksowanie i invoke
- Najlepsze praktyki