เมธอดส่วนขยาย
เพิ่มเมธอดให้ชนิดต่าง ๆ
เมธอดส่วนขยาย เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พารามิเตอร์โดยนัย
- given/using ใน Scala 3
- การแปลงโดยนัย
- เมธอดส่วนขยาย