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

val เทียบกับ var

การผูกค่าที่เปลี่ยนแปลงไม่ได้และเปลี่ยนแปลงได้

บทเรียน 1 จาก 413 ขั้นตอน

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

สองวิธีในการตั้งชื่อค่า

ใน Scala คุณผูกชื่อเข้ากับค่าด้วย val หรือ var

val สร้างการผูกแบบเปลี่ยนแปลงไม่ได้ กล่าวคือเมื่อกำหนดแล้ว จะไม่สามารถชี้ไปยังค่าอื่นได้อีก ส่วน var สร้างการผูกแบบเปลี่ยนแปลงได้ ซึ่งคุณสามารถกำหนดค่าใหม่ภายหลังได้

การเลือกใช้ระหว่างสองแบบนี้เป็นหนึ่งในทักษะแรก ๆ ที่วิศวกรแบ็กเอนด์ Scala ควรพัฒนา

val name = "Ada"
var score = 10

การกำหนด val

val อ่านได้อย่างเดียว คุณกำหนดค่าให้มันได้ครั้งเดียว และคอมไพเลอร์จะรับประกันว่าค่านั้นจะคงเดิม

สิ่งนี้ทำให้ทำความเข้าใจโค้ดได้ง่ายขึ้น เพราะ val จะไม่ทำให้คุณประหลาดใจด้วยค่าที่เปลี่ยนไปจากที่อื่น

object Main extends App {
  val pi = 3.14
  println(pi)
}

การกำหนดค่าใหม่ให้ val ล้มเหลว

การพยายามกำหนดค่าใหม่ให้ val เป็นข้อผิดพลาดขณะคอมไพล์ ไม่ใช่การหยุดทำงานขณะรัน โปรแกรมจะหยุดคุณก่อนที่จะเริ่มทำงานด้วยซ้ำ

ส่วนโค้ดด้านล่างจะล้มเหลวด้วยข้อความ reassignment to val

val country = "Turkey"
country = "Spain" // error: reassignment to val

การกำหนด var

คุณสามารถกำหนดค่าใหม่ให้ var ได้กี่ครั้งก็ได้ ตราบใดที่ค่าใหม่มีชนิดข้อมูลที่เข้ากันได้

ใช้ var เมื่อค่าจำเป็นต้องเปลี่ยนแปลงตามเวลาอย่างแท้จริง เช่น ตัวนับในลูป

object Main extends App {
  var count = 0
  count = count + 1
  count = count + 1
  println(count)
}

var ยังคงชนิดข้อมูลเดิม

แม้ var จะสามารถกำหนดค่าใหม่ได้ แต่ชนิดข้อมูลของมันจะถูกกำหนดตายตัว ตั้งแต่ตอนประกาศ

หาก level เริ่มต้นเป็น Int คุณจะไม่สามารถเก็บ String ลงในนั้นภายหลังได้ คอมไพเลอร์จะปฏิเสธชนิดข้อมูลที่ไม่ตรงกัน

var level = 1
level = 5        // ok, still an Int
level = "high"  // error: type mismatch

เลือกใช้ val เป็นค่าเริ่มต้น

แนวทางการเขียน Scala โดยทั่วไปนิยมใช้ val เกือบทุกกรณี การไม่เปลี่ยนแปลงค่าช่วยหลีกเลี่ยงข้อผิดพลาดได้หลายประเภท และทำให้โค้ดที่ทำงานพร้อมกันปลอดภัยยิ่งขึ้น

  • เลือกใช้ val เป็นอันดับแรก
  • เปลี่ยนไปใช้ var เฉพาะเมื่อจำเป็นต้องเปลี่ยนแปลงค่าจริง ๆ

เปลี่ยน var ให้เป็น val

ลูปจำนวนมากที่ดูเหมือนจำเป็นต้องใช้ var สามารถเขียนด้วย val และนิพจน์แทนได้

ในตัวอย่างนี้ ผลรวมคำนวณด้วยช่วงค่าและ sum โดยไม่ต้องเปลี่ยนแปลงค่า

object Main extends App {
  val total = (1 to 5).sum
  println(total)
}

ขอบเขตของการผูกชื่อ

ทั้ง val และ var จะมีอยู่ภายในบล็อก { ... } ที่ประกาศไว้

การผูกชื่อที่ประกาศภายในบล็อกจะมองไม่เห็นจากภายนอก ช่วยให้ชื่อเป็นระเบียบและป้องกันการนำชื่อกลับมาใช้โดยไม่ได้ตั้งใจ

object Main extends App {
  val outer = 1
  {
    val inner = 2
    println(outer + inner)
  }
  // inner is not visible here
}

Lazy val

lazy val จะคำนวณเมื่อถูกใช้งานครั้งแรกเท่านั้น จากนั้นจึงเก็บผลลัพธ์ไว้

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

object Main extends App {
  lazy val greeting = { println("computing"); "Hi" }
  println("before")
  println(greeting)
  println(greeting)
}

val พร้อมชนิดข้อมูลที่ระบุชัดเจน

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

ในที่นี้ amount ถูกประกาศเป็น Double แม้ว่า 10 จะดูเหมือน Int

val amount: Double = 10
val label: String = "price"

เปรียบเทียบ val กับ var

ทั้งสองแบบทำงานเหมือนกันจนกว่าคุณจะลองกำหนดค่าใหม่

  • val x: กำหนดค่าครั้งเดียวและคงเดิมตลอดไป
  • var y: กำหนดค่าและกำหนดใหม่ได้อย่างอิสระ

โปรแกรมด้านล่างจะเพิ่มค่าให้เฉพาะ var เท่านั้น

object Main extends App {
  val base = 100
  var bonus = 0
  bonus = bonus + 25
  println(base + bonus)
}

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

ทดสอบความเข้าใจเกี่ยวกับ val และ var

สรุปทบทวน

คุณได้เรียนรู้สองวิธีในการผูกชื่อใน Scala

  • val เปลี่ยนแปลงไม่ได้และเป็นตัวเลือกเริ่มต้น
  • var เปลี่ยนแปลงได้และควรใช้กับค่าที่จำเป็นต้องเปลี่ยนเท่านั้น
  • การกำหนดค่าใหม่ให้ val เป็นข้อผิดพลาดขณะคอมไพล์
  • ชนิดข้อมูลของทั้งสองแบบถูกกำหนดตายตัว ส่วน lazy val จะเลื่อนการคำนวณออกไป
เริ่มต้นได้ฟรี

เรียนรู้ Scala ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
143

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

บทเรียน “val เทียบกับ var” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “val เทียบกับ var”

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

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

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

บทเรียน “val เทียบกับ var” ใช้เวลานานแค่ไหน

บทเรียน 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