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

given/using ใน Scala 3

ไวยากรณ์สมัยใหม่

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

ค่าโดยนัยสมัยใหม่ใน Scala 3

Scala 3 แทนที่คีย์เวิร์ด implicit ที่มีหลายหน้าที่ด้วยไวยากรณ์ที่ชัดเจนยิ่งขึ้น: given ใช้กำหนดค่าโดยนัย และ using ใช้ประกาศพารามิเตอร์โดยนัย ทำให้เข้าใจเจตนาได้ง่ายขึ้นมาก

object Main:
  given greeting: String = "Hello"
  def greet(name: String)(using g: String): String = s"$g, $name!"
  def main(args: Array[String]): Unit =
    println(greet("Ann"))

given แทน implicit val

ใน Scala 2 จะเขียน implicit val x: T = ... ส่วน Scala 3 จะเขียน given x: T = ... ซึ่งเป็นการประกาศค่าที่พร้อมให้ใช้ในการแก้ค่าพารามิเตอร์โดยนัย

object Main:
  given factor: Int = 10
  def scale(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(scale(5))

using แทนพารามิเตอร์โดยนัย

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

object Main:
  given unit: String = "kg"
  def label(n: Int)(using u: String): String = s"$n$u"
  def main(args: Array[String]): Unit =
    println(label(75))

given แบบไม่ระบุชื่อ

คุณสามารถละชื่อของ given ได้เมื่อไม่จำเป็นต้องอ้างถึงค่านั้นโดยตรง คอมไพเลอร์ยังคงค้นหาค่านั้นตามชนิดได้

object Main:
  given Int = 3
  def triple(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(triple(7))

ดึงค่าด้วย summon

summon[T] ของ Scala 3 ใช้แทน implicitly[T] โดยดึงค่า given ชนิด T โดยตรง

object Main:
  given name: String = "Scala 3"
  def main(args: Array[String]): Unit =
    val n = summon[String]
    println(n)

พารามิเตอร์ using แบบไม่ระบุชื่อ

หากคุณเพียงต้องการส่งต่อพารามิเตอร์ using คุณสามารถไม่ระบุชื่อพารามิเตอร์ในส่วนคำสั่งได้: (using Int) แล้วเรียกใช้ภายในด้วย summon

object Main:
  given Int = 100
  def boosted(x: Int)(using Int): Int = x + summon[Int]
  def main(args: Array[String]): Unit =
    println(boosted(5))

ใช้ given กับคลาสชนิด

การใช้ given/using ที่เป็นไปตามแนวทางของภาษามากที่สุดคือการใช้กับคลาสชนิด คุณกำหนด trait จัดเตรียมอินสแตนซ์ given และกำหนดให้ต้องใช้ด้วย using

trait Show[A]:
  def show(a: A): String

object Main:
  given Show[Int] with
    def show(a: Int): String = s"Int($a)"

  def display[A](a: A)(using s: Show[A]): String = s.show(a)

  def main(args: Array[String]): Unit =
    println(display(42))

ขอบเขตบริบทยังคงใช้ได้

ขอบเขตบริบท [A: Show] ยังคงใช้ได้ และจะถูกแปลงเป็นพารามิเตอร์ using ใช้ร่วมกับ summon เพื่อเข้าถึงอินสแตนซ์

trait Show[A]:
  def show(a: A): String

object Main:
  given Show[String] with
    def show(a: String): String = s"Str($a)"

  def display[A: Show](a: A): String = summon[Show[A]].show(a)

  def main(args: Array[String]): Unit =
    println(display("hi"))

การส่งอาร์กิวเมนต์ using อย่างชัดเจน

คุณสามารถระบุพารามิเตอร์ using อย่างชัดเจนด้วยคีย์เวิร์ด using ณ จุดเรียกใช้ เพื่อเขียนทับ given ที่อยู่ในขอบเขต

object Main:
  given Int = 10
  def scale(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(scale(5))
    println(scale(5)(using 2))

การนำเข้า given

Scala 3 มีไวยากรณ์เฉพาะสำหรับนำเข้า given: import pkg.given หรือ import pkg.{given Show[Int]} ทำให้การนำเข้าค่าโดยนัยชัดเจนและมีเจตนา

object Instances:
  given Int = 5

object Main:
  import Instances.given
  def addBase(x: Int)(using b: Int): Int = x + b
  def main(args: Array[String]): Unit =
    println(addBase(10))

เหตุผลของไวยากรณ์ใหม่

ใน Scala 2 คีย์เวิร์ด implicit เดียวมีความหมายหลายแบบ Scala 3 จึงแยกแนวคิดออกเป็น given = จัดเตรียม และ using = เรียกใช้ โค้ดจึงชัดเจนขึ้นและเข้าใจข้อผิดพลาดได้ง่ายขึ้น

object Main:
  given pi: Double = 3.14159
  def area(r: Double)(using p: Double): Double = p * r * r
  def main(args: Array[String]): Unit =
    println(area(2.0))

ตรวจสอบอย่างรวดเร็ว

ใน Scala 3 คีย์เวิร์ดใดใช้แทน implicit สำหรับการจัดเตรียมและการเรียกใช้ค่า

สรุปทบทวน

คุณได้เรียนรู้ given/using ของ Scala 3 ดังนี้:

  • given จัดเตรียมค่าโดยนัย (แทน implicit val)
  • using ประกาศพารามิเตอร์โดยนัย
  • summon[T] แทน implicitly[T]
  • given สามารถไม่ระบุชื่อ และเหมาะอย่างยิ่งสำหรับคลาสชนิด
  • import pkg.given ใช้นำเข้า given อย่างชัดเจน

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

บทเรียน “given/using ใน Scala 3” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “given/using ใน Scala 3”

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

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

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

บทเรียน “given/using ใน Scala 3” ใช้เวลานานแค่ไหน

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

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

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

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

  1. พารามิเตอร์โดยนัย
  2. given/using ใน Scala 3
  3. การแปลงโดยนัย
  4. เมธอดส่วนขยาย
← กลับไปที่ Scala for Backend Engineering & Functional Programming