Trong bài viết này, bạn sẽ tìm hiểu về các đối số mặc định và đối số được đặt tên và hiểu về chúng hơn qua các ví dụ.

1. Đối số mặc định trong Kotlin

Trong Kotlin, bạn có thể cung cấp các giá trị mặc định cho các tham số trong định nghĩa hàm.

Nếu hàm được gọi với các đối số được truyền, các đối số đó sẽ được sử dụng làm tham số. Tuy nhiên, nếu ta gọi hàm mà không truyền (các) đối số, thì lúc này đối số mặc định được sử dụng.

Các đối số mặc định hoạt động như thế nào?  

Trường hợp I: Tất cả các đối số được truyền

Hàm foo()có hai đối số. Các đối số được cung cấp cùng với các giá trị mặc định. Tuy nhiên, trong chương trình trên, hàm foo()được gọi bằng cách truyền cả hai đối số. Do đó, các đối số mặc định không được sử dụng.

Giá trị của letter và letter bên trong hàm foo() lần lượt sẽ là ‘x’ và 2.

Trường hợp II: Tất cả các đối số không được thông qua

Ở đây, chỉ có một đối số (đối số đầu tiên) được truyền cho hàm foo(). Do đó, đối số đầu tiên sẽ sử dụng giá trị được truyền cho hàm. Tuy nhiên, đối số thứ hai là number sẽ lấy giá trị mặc định vì đối số thứ hai không được truyền trong khi gọi hàm.

Giá trị của letter và letter bên trong hàm foo() lần lượt sẽ là ‘y’ và 15.

Trường hợp III: Không có đối số được thông qua

Ở đây, hàm foo() được gọi mà không truyền bất kỳ đối số nào. Do đó, cả hai đối số sử dụng các giá trị mặc định của nó.

Giá trị của letter và letter bên trong hàm foo() lần lượt sẽ là ‘a’và 15.

Ví dụ: Đối số mặc định trong Kotlin

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

fun displayBorder(character: Char = '=', length: Int = 15) {
    for (i in 1..length) {
        print(character)
    }
}

fun main(args: Array<String>) {
    println("Output when no argument is passed:")
    displayBorder()

    println("\n\n'*' is used as a first argument.")
    println("Output when first argument is passed:")
    displayBorder('*')

    println("\n\n'*' is used as a first argument.")
    println("5 is used as a second argument.")
    println("Output when both arguments are passed:")
    displayBorder('*', 5)

}

Khi bạn chạy chương trình, kết quả sẽ là:

Output when no argument is passed:
===============

'*' is used as a first argument.
Output when first argument is passed:
***************

'*' is used as a first argument.
5 is used as a second argument.
Output when both arguments are passed:
*****

2. Đối số được đặt tên trong Kotlin

Trước khi nói về đối số được đặt tên, chúng ta hãy xem xét về việc sửa đổi đoạn code sau:

fun displayBorder(character: Char = '=', length: Int = 15) {
    for (i in 1..length) {
        print(character)
    }
}

fun main(args: Array<String>) {
    displayBorder(5)
}

Ở đây, chúng ta đang cố gắng truyền đối số thứ hai cho hàm displayBorder() và sử dụng đối số mặc định cho đối số thứ nhất. Tuy nhiên, khi chạy đoạn code này chương trình dịch sẽ báo lỗi. Đó là bởi vì trình biên dịch nghĩ rằng chúng ta đang cố gắng gán giá trị 5 (một giá trị thuộc kiểu dữ liệu Int) cho 1 ký tự (1 giá trị thuộc kiểu dữ liệu Char).

Để giải quyết tình huống này, ta có thể dử dụng các đối số được đặt tên. Dưới đây là cách thực hiện:

Ví dụ: Đối số được đặt tên trong Kotlin

fun displayBorder(character: Char = '=', length: Int = 15) {
    for (i in 1..length) {
        print(character)
    }
}

fun main(args: Array<String>) {
    displayBorder(length = 5)
}

Khi bạn chạy chương trình, kết quả sẽ là:

=====

Trong chương trình trên, chúng ta đang sử dụng đối số được đặt tên ( length = 5) để chỉ định rằng tham số length trong định nghĩa hàm sẽ lấy giá trị này (dù vị trí của đối số là gì đi nữa).

Trong chương trình trên, đối số đầu tiên (character) sử dụng giá trị mặc định (‘=’).

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!