0Pricing
Scala for Backend Engineering & Functional Programming · บทเรียน

เมธอดส่วนขยาย

เพิ่มเมธอดให้ชนิดต่าง ๆ

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

การเพิ่มเมธอดให้ชนิดข้อมูลที่มีอยู่

เมธอดส่วนขยาย ช่วยให้คุณเพิ่มเมธอดใหม่ให้กับชนิดข้อมูลที่คุณไม่ได้เป็นเจ้าของ เช่น Int หรือ String โดยไม่ต้องแก้ไขซอร์สของชนิดข้อมูลนั้น Scala 3 มีไวยากรณ์ที่สะอาดสำหรับการทำเช่นนี้

object Main:
  extension (x: Int)
    def squared: Int = x * x
  def main(args: Array[String]): Unit =
    println(5.squared)

ไวยากรณ์ของส่วนขยาย

เขียน extension (param: Type) แล้วตามด้วยการนิยามเมธอดหนึ่งรายการขึ้นไป ภายในแต่ละเมธอด พารามิเตอร์จะอ้างถึงค่าที่เป็นตัวรับ

object Main:
  extension (s: String)
    def shout: String = s.toUpperCase + "!"
  def main(args: Array[String]): Unit =
    println("hello".shout)

หลายเมธอดในบล็อกเดียว

ส่วนคำสั่ง extension เดียวสามารถนิยามเมธอดได้หลายรายการ โดยทุกเมธอดทำงานกับชนิดของตัวรับเดียวกัน

object Main:
  extension (x: Int)
    def squared: Int = x * x
    def cubed: Int = x * x * x
    def isEven: Boolean = x % 2 == 0
  def main(args: Array[String]): Unit =
    println(4.squared)
    println(3.cubed)
    println(6.isEven)

เมธอดส่วนขยายที่รับพารามิเตอร์

เมธอดส่วนขยายสามารถรับพารามิเตอร์ของตนเองเพิ่มเติมจากตัวรับได้

object Main:
  extension (x: Int)
    def times(s: String): String = s * x
  def main(args: Array[String]): Unit =
    println(3.times("ab"))

เมธอดส่วนขยายแบบเจเนอริก

ส่วนขยายสามารถเป็นแบบเจเนอริกได้ ทำให้เพิ่มเมธอดให้กับกลุ่มชนิดข้อมูลทั้งหมด เช่น List[A] ได้

object Main:
  extension [A](xs: List[A])
    def second: A = xs(1)
  def main(args: Array[String]): Unit =
    println(List(10, 20, 30).second)
    println(List("a", "b").second)

เหตุใดส่วนขยายจึงดีกว่าการแปลงโดยนัย

เมธอดส่วนขยายบรรลุเป้าหมายแบบเดิมของ 'pimp-my-library' ได้อย่างปลอดภัยกว่า เพราะจะเพิ่มเฉพาะเมธอดที่ระบุชื่อไว้ และไม่มีความเสี่ยงที่ชนิดข้อมูลจะถูกแปลงโดยเงียบ ๆ ในส่วนอื่น

object Main:
  extension (d: Double)
    def percentOf(total: Double): Double = d / total * 100
  def main(args: Array[String]): Unit =
    println(25.0.percentOf(200.0))

ส่วนขยายและคลาสชนิดข้อมูล

เมธอดส่วนขยายทำงานร่วมกับคลาสชนิดข้อมูลได้อย่างลงตัว: กำหนดพฤติกรรมผ่านอินสแตนซ์ given แล้วเปิดให้เรียกใช้เป็นเมธอดด้วย using

trait Show[A]:
  def show(a: A): String

object Main:
  given Show[Int] with
    def show(a: Int): String = s"<$a>"

  extension [A](a: A)
    def display(using s: Show[A]): String = s.show(a)

  def main(args: Array[String]): Unit =
    println(42.display)

การนิยามตัวดำเนินการ

เนื่องจากตัวดำเนินการเป็นเพียงเมธอดชนิดหนึ่ง ส่วนขยายจึงสามารถเพิ่มตัวดำเนินการเชิงสัญลักษณ์ให้กับชนิดข้อมูลที่มีอยู่ได้เช่นกัน

object Main:
  extension (x: Int)
    def **(exp: Int): Int = math.pow(x, exp).toInt
  def main(args: Array[String]): Unit =
    println(2 ** 10)

ขอบเขตและการนำเข้า

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

object StringOps:
  extension (s: String)
    def reversedWords: String = s.split(" ").reverse.mkString(" ")

object Main:
  import StringOps._
  def main(args: Array[String]): Unit =
    println("hello there world".reversedWords)

การต่อเมธอดส่วนขยาย

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

object Main:
  extension (s: String)
    def emphasize: String = s"*$s*"
  def main(args: Array[String]): Unit =
    println("scala".toUpperCase.emphasize)

ตัวช่วยที่ใช้งานได้จริง

เมธอดส่วนขยายเหมาะอย่างยิ่งสำหรับตัวช่วยเล็ก ๆ ตามโดเมน ซึ่งทำให้โค้ดที่เรียกใช้อ่านได้อย่างเป็นธรรมชาติ

object Main:
  extension (n: Int)
    def isPrime: Boolean =
      n > 1 && (2 until n).forall(d => n % d != 0)
  def main(args: Array[String]): Unit =
    println((2 to 12).filter(_.isPrime).toList)

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

ข้อได้เปรียบหลักของเมธอดส่วนขยายใน Scala 3 เหนือการแปลงโดยนัย สำหรับการเพิ่มเมธอดคืออะไร

สรุปทบทวน

คุณได้เรียนรู้เรื่องเมธอดส่วนขยายแล้ว:

  • extension (x: Type) def ... ใช้เพิ่มเมธอดให้กับชนิดข้อมูลที่มีอยู่
  • หนึ่งบล็อกสามารถนิยามได้หลายเมธอด รวมถึงตัวดำเนินการ
  • เมธอดเหล่านี้เป็นแบบเจเนอริกและรับพารามิเตอร์ได้
  • ทำงานร่วมกับคลาสชนิดข้อมูลผ่าน using ได้อย่างเป็นธรรมชาติ
  • ปลอดภัยกว่าการแปลงโดยนัย และต้องนำเข้าเข้าสู่ขอบเขตก่อนใช้งาน

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

บทเรียน “เมธอดส่วนขยาย” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “เมธอดส่วนขยาย”

เพิ่มเมธอดให้ชนิดต่าง ๆ คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่

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

บทเรียน “เมธอดส่วนขยาย” ใช้เวลานานแค่ไหน

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

ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม

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

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

  1. พารามิเตอร์โดยนัย
  2. given/using ใน Scala 3
  3. การแปลงโดยนัย
  4. เมธอดส่วนขยาย
← กลับไปที่ Scala for Backend Engineering & Functional Programming