การแยกโครงสร้าง
ดึงข้อมูลจากข้อมูลต้นทาง
การแยกโครงสร้าง เป็นบทเรียน 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 บทเรียน
การแยกโครงสร้างคืออะไร
การแยกโครงสร้าง หรือที่เรียกว่าการแยกส่วน หมายถึงการดึงส่วนประกอบของโครงสร้างข้อมูลออกมาโดยตรงภายในรูปแบบ
แทนที่จะเรียกเมธอดเข้าถึงข้อมูล คุณจะอธิบายรูปร่างของโครงสร้างและตั้งชื่อส่วนที่ต้องการ
การแยกทูเพิล
ทูเพิลใช้จัดกลุ่มค่าหลายค่าเข้าด้วยกัน คุณสามารถแยกค่าเหล่านั้นออกมาในการผูกค่าเพียงครั้งเดียว โดยเขียนชื่อไว้ในวงเล็บ
object Main {
def main(args: Array[String]): Unit = {
val pair = ("Ada", 1815)
val (name, year) = pair
println(s"$name was born in $year")
}
}ทูเพิลใน match
คุณสามารถแยกโครงสร้างทูเพิลภายใน match โดยตั้งชื่อหรือจับคู่ส่วนประกอบแต่ละส่วนได้
object Main {
def quadrant(p: (Int, Int)): String = p match {
case (0, 0) => "origin"
case (x, 0) => s"on x-axis at $x"
case (0, y) => s"on y-axis at $y"
case (x, y) => s"point ($x, $y)"
}
def main(args: Array[String]): Unit = {
println(quadrant((0, 0)))
println(quadrant((3, 0)))
println(quadrant((2, 5)))
}
}การแยกส่วนหัวของรายการ
ตัวดำเนินการ :: หรือ cons จะแยกรายการออกเป็นสมาชิกตัวแรก (ส่วนหัว) และส่วนที่เหลือ (ส่วนหาง)
รูปแบบ head :: tail จะจับคู่กับรายการที่ไม่ว่างทุกรายการ
object Main {
def first(xs: List[Int]): String = xs match {
case head :: tail => s"head=$head, rest=$tail"
case Nil => "empty"
}
def main(args: Array[String]): Unit = {
println(first(List(10, 20, 30)))
println(first(Nil))
}
}การจับคู่รูปร่างรายการแบบตรงทั้งหมด
คุณสามารถจับคู่รายการที่มีความยาวเจาะจงได้โดยระบุสมาชิก เช่น List(a, b) สำหรับรายการที่มีสมาชิกสองรายการพอดี
object Main {
def shape(xs: List[Int]): String = xs match {
case List() => "none"
case List(a) => s"one: $a"
case List(a, b) => s"two: $a, $b"
case _ => "many"
}
def main(args: Array[String]): Unit = {
println(shape(List()))
println(shape(List(1)))
println(shape(List(1, 2)))
println(shape(List(1, 2, 3)))
}
}การเรียกซ้ำด้วยส่วนหัวและส่วนหาง
การแยกส่วนหัวออกจากส่วนหางช่วยให้เรียกซ้ำกับรายการได้อย่างสะอาด
ในที่นี้ เราหาผลรวมของรายการโดยบวกส่วนหัวเข้ากับผลรวมของส่วนหาง
object Main {
def sum(xs: List[Int]): Int = xs match {
case Nil => 0
case head :: tail => head + sum(tail)
}
def main(args: Array[String]): Unit = {
println(sum(List(1, 2, 3, 4)))
}
}การแยกโครงสร้างที่ซ้อนกัน
รูปแบบสามารถซ้อนกันได้ คุณสามารถแยกทูเพิลภายในรายการ หรือแยกรายการภายในทูเพิลได้ในครั้งเดียว
object Main {
def main(args: Array[String]): Unit = {
val data = List(("a", 1), ("b", 2))
data match {
case (key, value) :: _ => println(s"first key=$key value=$value")
case Nil => println("empty")
}
}
}การละเว้นส่วนต่าง ๆ ด้วย _
ใช้ _ กับส่วนประกอบที่คุณไม่สนใจ วิธีนี้ช่วยให้รูปแบบมุ่งเน้นเฉพาะข้อมูลที่ต้องใช้จริง
object Main {
def main(args: Array[String]): Unit = {
val triple = (1, 2, 3)
val (_, middle, _) = triple
println(s"middle = $middle")
}
}การผูกสองสมาชิกแรกและเก็บส่วนที่เหลือ
คุณสามารถตั้งชื่อให้สมาชิกแรก ๆ และเก็บทุกอย่างหลังจากนั้นด้วยรูปแบบส่วนหาง
object Main {
def main(args: Array[String]): Unit = {
val xs = List(1, 2, 3, 4, 5)
xs match {
case a :: b :: rest => println(s"a=$a b=$b rest=$rest")
case _ => println("too short")
}
}
}เหตุใดจึงใช้การแยกโครงสร้าง
การแยกโครงสร้างทำให้การเข้าถึงข้อมูลมีลักษณะดังนี้:
- เชิงประกาศ: อธิบายรูปร่างของข้อมูลแทนขั้นตอนการทำงาน
- ปลอดภัย: ตรวจสอบโครงสร้างขณะดึงข้อมูล
- กระชับ: ผูกค่าหลายค่าในรูปแบบเดียว
การแยกโครงสร้างจะทรงพลังยิ่งขึ้นเมื่อใช้กับคลาสกรณี
นำทุกอย่างมารวมกัน
ตัวอย่างนี้แยกรายการทูเพิลและตอบสนองตามรูปร่างของข้อมูล
object Main {
def report(scores: List[(String, Int)]): String = scores match {
case Nil => "no scores"
case (name, pts) :: Nil => s"only $name with $pts"
case (name, pts) :: rest => s"top $name=$pts plus ${rest.size} more"
}
def main(args: Array[String]): Unit = {
println(report(Nil))
println(report(List(("Ann", 90))))
println(report(List(("Ann", 90), ("Bo", 80))))
}
}ตรวจสอบอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับการแยกโครงสร้าง
สรุปทบทวน
คุณได้เรียนรู้การแยกข้อมูลในรูปแบบ:
- แยกทูเพิลด้วย
(a, b) - แยกรายการด้วย
head :: tailหรือรูปร่างที่กำหนดแน่นอน เช่นList(a, b) Nilจับคู่กับรายการว่าง- ใช้
_เพื่อละเว้นส่วนต่าง ๆ และซ้อนรูปแบบสำหรับโครงสร้างเชิงลึก - การแยกส่วนหัวและส่วนหางช่วยให้เรียกซ้ำได้อย่างสะอาด
คำถามที่พบบ่อย
บทเรียน “การแยกโครงสร้าง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การแยกโครงสร้าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- นิพจน์ match
- การจับคู่ชนิดและค่า
- การ์ดและการผูกค่า
- การแยกโครงสร้าง