การอนุมานชนิดข้อมูล
ให้คอมไพเลอร์ระบุชนิดข้อมูล
การอนุมานชนิดข้อมูล เป็นบทเรียน 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 senseval ที่อนุมานได้ยังคงเปลี่ยนแปลงไม่ได้
การอนุมานเติมเฉพาะชนิดข้อมูลเท่านั้น ไม่ได้เปลี่ยนแปลงว่าการผูกชื่อนั้นเปลี่ยนแปลงได้หรือไม่
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- val เทียบกับ var
- ชนิดข้อมูลพื้นฐานและค่าตามตัวอักษร
- การอนุมานชนิดข้อมูล
- นิพจน์เหนือคำสั่ง