เมื่อเราเรียกใช้ method แล้วเราสามารถระบุชื่อ argument (label the argument) สำหรับ parameter ใดๆ ได้ดังนี้:
def printName(first: String, last: String): Unit =
println(s"$first $last")
printName("John", "Public") // แสดงค่า "John Public"
printName(first = "John", last = "Public") // แสดงค่า "John Public"
printName(last = "Public", first = "John") // แสดงค่า "John Public"
printName("Elton", last = "John") // แสดงค่า "Elton John"
named argument นั้นมีประโยชน์เมื่อ parameter 2 ตัวมี type เดียวกัน
ทำให้ argument ที่เราส่งไปให้ function อาจถูกสลับกันโดยไม่ได้ตั้งใจ
สังเกตว่าเราจะเขียน argument ที่ระบุชื่อในลำดับใดก็ได้
แต่ถ้า argument ไม่ได้อยู่ในลำดับของ parameter ใน function จากซ้ายไปขวา แล้ว argument ที่เหลือจะต้องระบุชื่อทั้งหมด
ในตัวอย่างข้างล่างนี้ named argument ทำให้เราสามารถเว้น parameter middle
ได้
แต่ในกรณีที่เกิด error: positional after named argument
เนื่องจาก argument ตัวแรกไม่ได้เรียงตามลำดับของ parameter (ตัวแรกไม่ใช่ parameter first
และ argument ตัวที่ 2 เป็นต้นไปก็ไม่ได้ระบุชื่อด้วย)
ดังนั้น เราจะต้องระบุชื่อ argument ตั้งแต่ตัวที่ 2 เป็นต้นไป
def printFullName(first: String, middle: String = "Q.", last: String): Unit =
println(s"$first $middle $last")
printFullName(first = "John", last = "Public") // แสดงค่า "John Q. Public"
printFullName("John", last = "Public") // แสดงค่า "John Q. Public"
printFullName("John", middle = "Quincy", "Public") // แสดงค่า "John Quincy Public"
printFullName(last = "Public", first = "John") // แสดงค่า "John Q. Public"
printFullName(last = "Public", "John") // error: positional after named argument
เราสามารถใช้ Named Argument กับการเรียกใช้ method ของ Java ได้
แต่ทำได้เฉพาะในกรณีที่ Java library นั้นถูกคอมไพล์ด้วยออพชั่น -parameters
เท่านั้น
Contributors to this page:
Contents
- บทนำ
- พื้นฐาน
- ชนิดข้อมูล
- คลาส
- Default Parameter Values
- Named Arguments
- Traits
- Tuples
- Class Composition with Mixins
- Higher-order Functions
- Nested Methods
- Multiple Parameter Lists (Currying)
- Case Classes
- Pattern Matching
- Singleton Objects
- Regular Expression Patterns
- Extractor Objects
- For Comprehensions
- Generic Classes
- Variance
- Upper Type Bounds
- Lower Type Bounds
- Inner Classes
- Abstract Type Members
- Compound Types
- Self-types
- Implicit Parameters
- Implicit Conversions
- Polymorphic Methods
- Type Inference
- Operators
- By-name Parameters
- Annotations
- Packages and Imports
- Package Objects