0Pricing
Kotlin Academy · บทเรียน

ดัชนีและการเรียกใช้งาน

get, set และ invoke

ดัชนีและการเรียกใช้งาน เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

ตัวดำเนินการดัชนี

การกำหนด operator fun get ทำให้คุณอ่านข้อมูลด้วยไวยากรณ์วงเล็บเหลี่ยมได้: 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])
}

การเขียนด้วยตัวดำเนินการกำหนดค่า

operator fun set เปิดให้กำหนดค่าได้: obj[i] = value พารามิเตอร์ตัวสุดท้ายคือค่าที่จะกำหนด

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])
}

การใช้ดัชนีหลายอาร์กิวเมนต์

get และ set รับดัชนีได้หลายตัว จึงเหมาะอย่างยิ่งสำหรับเมทริกซ์

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])
}

การใช้ดัชนีที่ไม่ใช่จำนวนเต็ม

พารามิเตอร์ดัชนีสามารถเป็นชนิดข้อมูลใดก็ได้ ทำให้เข้าถึงข้อมูลในลักษณะคล้ายแผนที่ได้

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"])
}

ตัวดำเนินการ Invoke

การกำหนด operator fun invoke ทำให้คุณเรียกใช้อินสแตนซ์ราวกับเป็นฟังก์ชันได้: obj()

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

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

Invoke พร้อมอาร์กิวเมนต์

invoke รับพารามิเตอร์ได้ ทำให้ออบเจ็กต์ทำงานเหมือนฟังก์ชันที่รับพารามิเตอร์

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

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

อ็อบเจ็กต์ที่เรียกใช้ได้และมีสถานะ

เนื่องจากอ็อบเจ็กต์เก็บสถานะไว้ invoke จึงสามารถสร้างอ็อบเจ็กต์ที่มีลักษณะเหมือนฟังก์ชันและกำหนดค่าได้

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

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

โอเวอร์โหลดการเรียกใช้หลายรูปแบบ

คุณสามารถประกาศโอเวอร์โหลดของ invoke ได้หลายรายการ โดยใช้พารามิเตอร์ที่แตกต่างกัน

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)
}

ดัชนีในนิพจน์

การเข้าถึงด้วยดัชนีสามารถประกอบเข้ากับการดำเนินการอื่น ๆ ได้อย่างเป็นธรรมชาติ

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])
}

การรวม get และ invoke

ชนิดข้อมูลหนึ่งสามารถรองรับทั้งการเข้าถึงด้วยดัชนีและการเรียกใช้ เพื่อสร้างเอพีไอที่สื่อความหมายได้ดี

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())
}

การใช้งานในไลบรารีมาตรฐาน

list[i] ของรายการและ map[key] ของแมปก็คือตัวดำเนินการเหล่านี้โดยตรง ชนิดข้อมูลของคุณก็สามารถใช้งานได้เป็นธรรมชาติในลักษณะเดียวกัน

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

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับดัชนีและการเรียกใช้

สรุปทบทวน

คุณได้เรียนรู้เรื่องดัชนีและการเรียกใช้:

  • get รองรับ obj[i] ส่วน set รองรับ obj[i] = v
  • ตัวดำเนินการดัชนีรองรับคีย์หลายตัวและคีย์ที่ไม่ใช่ชนิด Int
  • invoke ทำให้สามารถเรียกอินสแตนซ์ได้เหมือนฟังก์ชัน ทั้งแบบมีและไม่มีอาร์กิวเมนต์
  • คอลเลกชันมาตรฐานใช้ตัวดำเนินการเหล่านี้โดยตรง
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"])
}

คำถามที่พบบ่อย

บทเรียน “ดัชนีและการเรียกใช้งาน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ดัชนีและการเรียกใช้งาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ดัชนีและการเรียกใช้งาน”

get, set และ invoke คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ดัชนีและการเรียกใช้งาน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชันตัวดำเนินการ
  2. ตัวดำเนินการเปรียบเทียบ
  3. ดัชนีและการเรียกใช้งาน
  4. แนวปฏิบัติที่ดี
← กลับไปที่ Kotlin Academy