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

ฟังก์ชันตัวดำเนินการ

โอเวอร์โหลด plus, minus และอื่น ๆ

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

การโอเวอร์โหลดตัวดำเนินการคืออะไร

การโอเวอร์โหลดตัวดำเนินการ ทำให้ชนิดข้อมูลของคุณตอบสนองต่อสัญลักษณ์อย่าง + หรือ - ได้ คุณกำหนดฟังก์ชันด้วยตัวปรับแต่ง operator และชื่อเฉพาะ

data class Point(val x: Int, val y: Int) {
    operator fun plus(o: Point) = Point(x + o.x, y + o.y)
}

fun main() {
    println(Point(1, 2) + Point(3, 4))
}

คีย์เวิร์ด operator

ตัวปรับแต่ง operator บอกคอมไพเลอร์ว่าฟังก์ชันนี้รองรับตัวดำเนินการ หากไม่มีตัวปรับแต่งนี้ การเรียกใช้ a + b จะไม่ทำงาน

data class Money(val amount: Int) {
    operator fun plus(o: Money) = Money(amount + o.amount)
}

fun main() {
    println(Money(5) + Money(3))
}

ชื่อที่เป็นแบบแผน

ตัวดำเนินการแต่ละตัวจะจับคู่กับชื่อฟังก์ชันที่กำหนดไว้ตายตัว ได้แก่ plus สำหรับ +, minus สำหรับ -, times สำหรับ *, div สำหรับ / และ rem สำหรับ %

data class Vec(val n: Int) {
    operator fun times(k: Int) = Vec(n * k)
}

fun main() {
    println(Vec(4) * 3)
}

การลบและการคูณ

คุณสามารถกำหนดตัวดำเนินการหลายตัวให้กับชนิดข้อมูลเดียวกันได้

data class Point(val x: Int, val y: Int) {
    operator fun minus(o: Point) = Point(x - o.x, y - o.y)
    operator fun times(k: Int) = Point(x * k, y * k)
}

fun main() {
    println(Point(5, 5) - Point(1, 2))
    println(Point(2, 3) * 2)
}

ตัวดำเนินการเอกภาค

การลบแบบเอกภาคใช้ unaryMinus การบวกแบบเอกภาคใช้ unaryPlus และ not รองรับตัวดำเนินการ !

data class Temp(val c: Int) {
    operator fun unaryMinus() = Temp(-c)
}

fun main() {
    println(-Temp(10))
}

การเพิ่มค่าและลดค่า

inc รองรับ ++ และ dec รองรับ -- ทั้งสองตัวจะคืนค่าใหม่ที่มีชนิดข้อมูลเดียวกัน

data class Counter(val n: Int) {
    operator fun inc() = Counter(n + 1)
}

fun main() {
    var c = Counter(0)
    c++
    println(c.n)
}

การกำหนดค่าแบบผสม

plusAssign รองรับ += สำหรับตัวรับที่เปลี่ยนแปลงได้ หากมีเพียง plus อยู่เท่านั้น += จะกำหนดค่าให้ตัวแปรใหม่แทน

class Bag {
    val items = mutableListOf<String>()
    operator fun plusAssign(item: String) { items.add(item) }
}

fun main() {
    val bag = Bag()
    bag += "apple"
    println(bag.items)
}

ตัวดำเนินการกับชนิดข้อมูลต่างกัน

ชนิดข้อมูลของพารามิเตอร์ไม่จำเป็นต้องตรงกับชนิดข้อมูลของตัวรับ ในตัวอย่างนี้ การคูณมาตราส่วนของจุดด้วยจำนวนเต็มจะคืนค่าเป็นจุด

data class Size(val w: Int, val h: Int) {
    operator fun times(factor: Int) = Size(w * factor, h * factor)
}

fun main() {
    println(Size(2, 3) * 4)
}

การใช้เป็นฟังก์ชันส่วนขยาย

สามารถกำหนดตัวดำเนินการเป็นฟังก์ชันส่วนขยายได้ แม้แต่กับชนิดข้อมูลที่คุณไม่ได้เป็นเจ้าของ

data class Point(val x: Int, val y: Int)

operator fun Point.plus(o: Point) = Point(x + o.x, y + o.y)

fun main() {
    println(Point(1, 1) + Point(2, 2))
}

การต่อโซ่ตัวดำเนินการ

ตัวดำเนินการที่โอเวอร์โหลดจะประกอบกันได้เหมือนตัวดำเนินการในตัว และเคารพลำดับความสำคัญตามปกติ

data class N(val v: Int) {
    operator fun plus(o: N) = N(v + o.v)
    operator fun times(o: N) = N(v * o.v)
}

fun main() {
    val r = N(2) + N(3) * N(4)
    println(r.v)
}

ชนิดข้อมูลที่ส่งคืนเป็นอิสระ

ตัวดำเนินการสามารถส่งคืนชนิดข้อมูลใดก็ได้ แต่การส่งคืนชนิดข้อมูลเดิมจะทำให้การใช้งานเข้าใจง่ายและต่อโซ่ได้

data class Vec(val x: Int, val y: Int) {
    operator fun plus(o: Vec) = Vec(x + o.x, y + o.y)
}

fun main() {
    println(Vec(1, 2) + Vec(3, 4))
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับฟังก์ชันตัวดำเนินการของคุณ

สรุปทบทวน

คุณได้เรียนรู้เกี่ยวกับ ฟังก์ชันตัวดำเนินการ:

  • กำกับฟังก์ชันด้วย operator และชื่อที่เป็นแบบแผน (plus, minus, times และอื่น ๆ)
  • รองรับตัวดำเนินการเอกภาค การเพิ่มค่า และการกำหนดค่าแบบผสม
  • ตัวดำเนินการสามารถเป็นสมาชิกหรือฟังก์ชันส่วนขยายได้
  • การส่งคืนชนิดข้อมูลเดิมทำให้การต่อโซ่เข้าใจได้ง่าย
data class P(val x: Int) {
    operator fun plus(o: P) = P(x + o.x)
}

fun main() {
    println((P(2) + P(3)).x)
}

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

บทเรียน “ฟังก์ชันตัวดำเนินการ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ฟังก์ชันตัวดำเนินการ”

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

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

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

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

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

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

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

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

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