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

การอนุมานชนิดข้อมูล

ให้คอมไพเลอร์ระบุชนิดข้อมูล

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

การอนุมานชนิดข้อมูลคืออะไร

Scala เป็นภาษาที่กำหนดชนิดข้อมูลแบบคงที่ แต่คุณแทบไม่ต้องเขียนชนิดข้อมูลเอง คอมไพเลอร์จะอนุมานชนิดข้อมูลจากค่าทางด้านขวามือ

คุณจึงได้ความปลอดภัยจากชนิดข้อมูลพร้อมความกระชับแบบภาษาที่กำหนดชนิดข้อมูลแบบไดนามิก

val n = 42        // inferred Int
val label = "hi" // inferred String

การอนุมานจากค่าคงที่

เมื่อคุณเขียน val x = 5 คอมไพเลอร์จะเห็นค่าคงที่ชนิด Int และกำหนดให้ x มีชนิด Int

ค่าคงที่ทศนิยมจะกลายเป็น Double และข้อความในอัญประกาศจะกลายเป็น String

object Main extends App {
  val count = 5
  val ratio = 1.5
  println(count + ratio)
}

การอนุมานชนิดข้อมูลส่งคืนของฟังก์ชัน

คอมไพเลอร์ยังสามารถอนุมานชนิดข้อมูลส่งคืนของเมธอดจากส่วนเนื้อหาของเมธอดได้

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

object Main extends App {
  def square(x: Int) = x * x
  println(square(6))
}

พารามิเตอร์ยังต้องระบุชนิดข้อมูล

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

โค้ดด้านล่างจะคอมไพล์ไม่ได้หากไม่มี : Int ที่ x

def increment(x: Int) = x + 1 // type on x is required

ชนิดข้อมูลร่วมที่อนุมานได้

เมื่อค่าอาจมีได้หลายชนิด Scala จะอนุมานชนิดข้อมูลร่วมที่เฉพาะเจาะจงที่สุด

การผสม Int กับ Double ในการคำนวณจะขยายผลลัพธ์ให้เป็น Double

object Main extends App {
  val mixed = 3 + 2.0  // Double
  println(mixed)
}

การอนุมานในคอลเลกชัน

คอลเลกชันจะอนุมานชนิดข้อมูลของสมาชิกจากค่าที่คุณใส่ลงไป

รายการจำนวนเต็มจะกลายเป็น List[Int] โดยอัตโนมัติ คุณจึงยังคงได้ความปลอดภัยจากชนิดข้อมูลอย่างเต็มที่โดยไม่ต้องใส่คำอธิบาย

object Main extends App {
  val nums = List(1, 2, 3) // List[Int]
  println(nums.sum)
}

เมื่อการอนุมานทำให้ประหลาดใจ

บางครั้งการอนุมานเลือกชนิดข้อมูลที่กว้างกว่าที่คุณต้องการ รายการตัวเลขต่างชนิดอาจถูกอนุมานเป็น List[Double] หรือแม้แต่ List[AnyVal]

หากชนิดข้อมูลที่อนุมานไม่เหมาะกับความต้องการ ให้เพิ่มคำอธิบายชนิดข้อมูลอย่างชัดเจน

val a = List(1, 2.0)        // List[Double]
val b = List(1, "two")     // List[Any]

กำหนดทับด้วยคำอธิบายชนิดข้อมูล

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

ในที่นี้ ค่าคงที่ 7 ถูกขยายให้เป็น Long โดยตั้งใจ

val seconds: Long = 7
val data: List[Int] = List(1, 2, 3)

ส่วนติดต่อสาธารณะ: ระบุให้ชัดเจน

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

วิธีนี้ช่วยให้สัญญาของไลบรารีคงที่ แม้การนำไปใช้งานภายในจะเปลี่ยนแปลง

def total(items: List[Int]): Int = items.sum

การอนุมานยังคงรักษาความปลอดภัยจากชนิดข้อมูล

การอนุมานไม่ได้ทำให้ระบบชนิดข้อมูลอ่อนแอลง คอมไพเลอร์ยังคงปฏิเสธการดำเนินการที่ไม่ถูกต้อง

ด้านล่าง name ถูกอนุมานเป็น String ดังนั้นการนำไปคูณกับตัวเลขจึงคอมไพล์ไม่ผ่าน ซึ่งเป็นพฤติกรรมที่ถูกต้อง

val name = "Lia"
val bad = name * 3 // error: value * is not a member of String in this sense

val ที่อนุมานได้ยังคงเปลี่ยนแปลงไม่ได้

การอนุมานเติมเฉพาะชนิดข้อมูลเท่านั้น ไม่ได้เปลี่ยนแปลงว่าการผูกชื่อนั้นเปลี่ยนแปลงได้หรือไม่

val n = 10 ยังคงเปลี่ยนแปลงไม่ได้และมีชนิดเป็น Int คอมไพเลอร์เพียงช่วยให้คุณไม่ต้องพิมพ์ : Int

object Main extends App {
  val n = 10 // inferred Int, still a val
  println(n * n)
}

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

ในกรณีใดที่ Scala ยังคงกำหนดให้คุณเขียนชนิดข้อมูล

สรุปทบทวน

การอนุมานชนิดข้อมูลช่วยให้ Scala เขียนโค้ดได้กระชับโดยไม่สูญเสียความปลอดภัยแบบตรวจสอบชนิดข้อมูลแบบคงที่

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

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

บทเรียน “การอนุมานชนิดข้อมูล” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การอนุมานชนิดข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

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

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

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

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

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

  1. val เทียบกับ var
  2. ชนิดข้อมูลพื้นฐานและค่าตามตัวอักษร
  3. การอนุมานชนิดข้อมูล
  4. นิพจน์เหนือคำสั่ง
← กลับไปที่ Scala for Backend Engineering & Functional Programming