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

ฟังก์ชันส่วนขยาย: ไวยากรณ์และกฎการเลือกใช้

เขียนฟังก์ชันส่วนขยายและทำความเข้าใจความหมายของการเลือกใช้แบบ static

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

ฟังก์ชันส่วนขยายคืออะไร

ฟังก์ชันส่วนขยายช่วยให้คุณเพิ่มฟังก์ชันใหม่ให้คลาสที่มีอยู่ได้โดยไม่ต้องแก้ไขคลาสหรือใช้การสืบทอด

ไวยากรณ์พื้นฐานของฟังก์ชันส่วนขยาย

ใส่ชนิดที่กำลังขยายไว้หน้าชื่อฟังก์ชัน ซึ่งเรียกว่า ชนิดผู้รับ
fun String.shout(): String = uppercase() + "!"
println("hello".shout())  // HELLO!
fun Int.isEven() = this % 2 == 0
println(4.isEven())  // true

this ในส่วนขยาย

ภายในฟังก์ชันส่วนขยาย this หมายถึงอ็อบเจ็กต์ผู้รับ
fun List<Int>.secondOrNull(): Int? {
    return if (size >= 2) this[1] else null
}
println(listOf(10, 20, 30).secondOrNull())  // 20
println(listOf(5).secondOrNull())           // null

การจัดส่งแบบสแตติก: ส่วนขยายไม่เขียนทับ

ฟังก์ชันส่วนขยายจะถูกเลือกแบบสแตติกในเวลาคอมไพล์ตามชนิดที่ประกาศไว้ โดยฟังก์ชันเหล่านี้ไม่ใช่แบบเสมือน
open class Base
class Child : Base()
fun Base.greet() = "Hello from Base"
fun Child.greet() = "Hello from Child"

val obj: Base = Child()
println(obj.greet())  // "Hello from Base" (static dispatch!)

ส่วนขยายเทียบกับฟังก์ชันสมาชิก

หากคลาสมีฟังก์ชันสมาชิกที่มีลายเซ็นเดียวกับฟังก์ชันส่วนขยาย ฟังก์ชันสมาชิกจะมีสิทธิ์ถูกเรียกใช้ก่อนเสมอ
class Greeter {
    fun hello() = "member hello"
}
fun Greeter.hello() = "extension hello"  // shadowed!
println(Greeter().hello())  // "member hello"

ส่วนขยายของผู้รับที่เป็นค่าว่างได้

คุณสามารถขยายชนิดที่เป็นค่าว่างได้ ภายในส่วนขยาย ให้จัดการค่าว่างด้วยการตรวจสอบ 'this == null'
fun String?.orEmpty() = this ?: ""
fun Any?.toStringSafe() = this?.toString() ?: "null"
println(null.orEmpty())  // ""
println(42.toStringSafe())  // "42"

การมองเห็นและขอบเขต

ส่วนขยายสามารถอยู่ระดับบนสุด (ทั่วโลก) อยู่ในคลาส (ส่วนขยายสมาชิก) หรืออยู่ในไฟล์ และจะปฏิบัติตามกฎการมองเห็นทั่วไป
// Top-level extension:
fun List<String>.joinUppercase() = joinToString { it.uppercase() }
// Private to file:
private fun String.clean() = trim().lowercase()

ส่วนขยายของอ็อบเจ็กต์คู่หู

เพิ่มส่วนขยายให้กับอ็อบเจ็กต์คู่หู เพื่อขยายเนมสเปซระดับคลาส
class User(val name: String) {
    companion object
}
fun User.Companion.guest() = User("Guest")
val guest = User.guest()

ส่วนขยายบนชนิดของไลบรารีมาตรฐาน

คุณสามารถขยายชนิดใดก็ได้ รวมถึงชนิดที่มีมาให้ในระบบ
fun Double.roundTo(decimals: Int): Double {
    val factor = Math.pow(10.0, decimals.toDouble())
    return Math.round(this * factor) / factor
}
println(3.14159.roundTo(2))  // 3.14

การจัดระเบียบส่วนขยาย

จัดกลุ่มส่วนขยายของชนิดหนึ่งไว้ในไฟล์เฉพาะ เช่น StringExtensions.kt และ DateExtensions.kt
// StringExtensions.kt
fun String.titleCase() = split(" ")
    .joinToString(" ") {
        it.replaceFirstChar { c -> c.uppercase() }
    }
println("hello world".titleCase())  // Hello World

ส่วนขยายเข้าถึงสมาชิกส่วนตัวไม่ได้

ส่วนขยายเข้าถึงได้เฉพาะสมาชิกสาธารณะและสมาชิกภายในเท่านั้น ไม่สามารถเข้าถึงสมาชิกส่วนตัวหรือสมาชิกที่ได้รับการปกป้องได้
class Secret {
    private val key = "hidden"
    val name = "public"
}
fun Secret.reveal() {
    println(name)  // OK
    // println(key)  // Error: key is private
}

ตรวจสอบอย่างรวดเร็ว

หากฟังก์ชันสมาชิกของคลาสและฟังก์ชันส่วนขยายมีลายเซ็นเดียวกัน ฟังก์ชันใดจะถูกเรียกใช้

ทบทวน

ฟังก์ชันส่วนขยายเพิ่มพฤติกรรมให้คลาสใดก็ได้โดยไม่ต้องแก้ไขคลาส ฟังก์ชันเหล่านี้ถูกจัดส่งแบบสแตติก จึงไม่มีการเขียนทับ ฟังก์ชันสมาชิกมีสิทธิ์เหนือส่วนขยาย ใช้ผู้รับที่เป็นค่าว่างได้สำหรับตัวช่วยที่ปลอดภัยต่อค่าว่าง บทถัดไป: คุณสมบัติส่วนขยาย

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

บทเรียน “ฟังก์ชันส่วนขยาย: ไวยากรณ์และกฎการเลือกใช้” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ฟังก์ชันส่วนขยาย: ไวยากรณ์และกฎการเลือกใช้”

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

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

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

บทเรียน “ฟังก์ชันส่วนขยาย: ไวยากรณ์และกฎการเลือกใช้” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ฟังก์ชันส่วนขยาย: ไวยากรณ์และกฎการเลือกใช้
  2. พร็อพเพอร์ตีส่วนขยายและส่วนขยายแบบคำนวณค่า
  3. ส่วนขยายตามขอบเขตและส่วนขยายของ Companion
  4. ส่วนขยายเชิงปฏิบัติ: ตัวช่วย Context, View และ String
← กลับไปที่ Kotlin Academy