× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Function literals cùng receiver trong Kotlin

02/06/2022 10:47

Trong blog này, chúng ta sẽ tìm hiểu về các literals của hàm với bộ thu trong kotlin. Trước khi bắt đầu, chúng ta hãy đi qua một số thông tin cơ bản về literals cùng receiver ngay sau đây!

Trong blog này, chúng ta sẽ tìm hiểu về các literals của hàm với bộ thu trong kotlin. Trước khi bắt đầu, chúng ta hãy đi qua một số thông tin cơ bản về literals cùng receiver ngay sau đây!

Đầu tiên, hãy kiểm tra cách viết một hàm. Chúng ta sẽ xem cách chúng ta có thể sử dụng một hàm và API StringBuilder cho tác vụ tạo thẻ từ các chuỗi đã cho. Chức năng trông giống như,

fun appendTag(string: String): String {

    return StringBuilder().append("<")

        .append(string)

        .append(">")

        .toString()

}

Bây giờ, giả sử chúng ta có hai chuỗi MindOrksAfterAcademy và muốn chuyển đổi các chuỗi thành một thẻ thì chúng ta gọi,

// Variables

val A = "MindOrks"

val B = "AfterAcademy"




// Using the function

appendTag(A)

appendTag(B)

Ở đây, chúng ta phải gọi hàm append để in đầu ra.

Bây giờ, trong Kotlin để rút gọn điều này, chúng ta có một thứ gọi là Hàm mở rộng. Hãy tạo một chức năng mở rộng để tạo thẻ,

fun String.appendTag() {

    StringBuilder().append("<")

        .append(this)

        .append(">")

        .toString()

}

Và, chúng ta sử dụng các chức năng mở rộng trong Kotlin như,

// Variables

val A = "MindOrks"

val B = "AfterAcademy"




// Using the extension function

A.appendTag()

B.appendTag()

Ở đây, bạn có thể thấy chúng ta không gọi hàm appendTag nhiều lần. Đúng hơn, chúng ta chỉ gọi appendTag như một phần mở rộng với toán tử dấu chấm .

Cả hai bằng cách gọi hàm và hàm mở rộng, chúng ta nhận được kết quả sau:

<MindOrks>

<AfterAcademy>

Bây giờ, chúng ta đã chuyển đổi thành công các chuỗi thành một thẻ bằng cách sử dụng chức năng Mở rộng.

Bây giờ, chúng ta phải tìm hiểu về Lambda và hàm Lệnh cao hơn. Về điều đó, tôi sẽ không giải thích ở đây. 

Bây giờ, hãy tạo một hàm bậc cao hơn và chuyển một lambda làm tham số.

Chúng ta sẽ tạo một hàm có tên là buildString và truyền StringBuilder làm tham số. Nó sẽ là,

fun buildString(action: (StringBuilder) -> Unit): String {

    val builder = StringBuilder()

    action(builder)

    return builder.toString()

}

Nơi đây,

  • buildString nhận một hành động hàm làm tham số
  • hàm action nhận StringBuilder (người xây dựng) làm tham số trả về Unit (void trong Java)
  • và hàm tổng thể buildString trả về chuỗi dưới dạng đầu ra.

Bây giờ, để sử dụng hàm buildString, chúng ta gọi nó bằng cách sử dụng

buildString { builder ->

        builder.append("<")

        builder.append("MindOrks")

        builder.append(">")

}

chúng ta đang sử dụng trình tạo dưới dạng tham số bởi vì chúng ta đang truyền trong hành động (trình tạo)

Ở đây, chúng ta đang gọi hàm buildString khi truyền trình tạo làm tham số cho hàm.

Vì vậy, để giải thích nó tốt hơn bằng các thuật ngữ đơn giản, hãy để tôi mở rộng hàm.

buildString (fun someFunctionName(builder:StringBuilder) { 

    builder.append("<")

    builder.append("MindOrks")

    builder.append(">")

})

Ở đây, chúng ta đã truyền một hàm cho hàm buildString có tham số kiểu StringBuilder . Sau đó, chúng ta đang gọi trình tạo tham số để thực hiện thao tác nối thêm cho chúng ta như mong đợi.

Lưu ý: Đây chỉ là cho mục đích giải thích.

Bây giờ, khi chúng ta loại bỏ hàm và muốn sử dụng lambda thì chúng ta viết như sau,

buildString { builder ->

    builder.append("<")

    builder.append("MindOrks")

    builder.append(">")

}

Nơi chúng ta chỉ viết phần mà chúng ta đã viết dưới hàm someFunctionName . Ở đây, builder receiver.

Bộ thu được sử dụng trong kotlin để truy cập thuộc tính của loại bộ thu mà không cần bất kỳ dòng mã hoặc bộ định tính bổ sung nào

Bây giờ, để làm cho cuộc sống đơn giản hơn, chúng ta sẽ sử dụng Idiomatic Kotlin. Trong đó, chúng ta sẽ loại bỏ sự phụ thuộc rõ ràng của trình tạo trong lambda.

Bây giờ, hãy lấy lambda buildString ,

buildString { builder ->

    builder.append("<")

    builder.append("MindOrks")

    builder.append(">")

}

Về điều này, chúng ta muốn đạt được,

buildString {

    append("<")

    append("MindOrks")

    append(">")

}

Tại đây, chúng ta có thể truy cập trình tạo bằng từ khóa này và trong khi viết, chúng ta có thể bỏ qua điều này .

Để giải thích cách chúng ta có thể làm điều đó, hãy để tôi mở rộng lại lambda buildString ,

buildString (fun someFunctionName(builder:StringBuilder) {

    builder.append("<")

    builder.append("MindOrks")

    builder.append(">")

})

Lưu ý: Đây chỉ là cho mục đích giải thích.

Bây giờ, để truy cập thuộc tính của StringBuilder, chúng ta sẽ tạo một hàm mở rộng của nó. Kiểm tra các mẫu mã ở trên để xem cách chúng ta tạo các hàm mở rộng. Để làm điều đó, chúng ta sẽ thêm,

buildString (fun someFunctionName(builder:StringBuilder).extFn() {

    builder.append("<")

    builder.append("MindOrks")

    builder.append(">")

})

Lưu ý: Đây chỉ là cho mục đích giải thích.

Và vì bây giờ chúng ta có tham chiếu đến StringBuilder trong hàm như chúng ta đã biết từ ví dụ về hàm Mở rộng ở trên. chúng ta có thể viết chuỗi xây dựng dưới dạng,

buildString (fun someFunctionName(builder:StringBuilder).extFn() {

   append("<")

   append("MindOrks")

   append(">")

})

Bây giờ, chúng ta cũng có thể loại bỏ extFn () dưới dạng,

buildString (fun someFunctionName(builder:StringBuilder).() {

    append("<")

    append("MindOrks")

    append(">")

})

Tại đây, bạn có thể thấy chúng ta đã loại bỏ extFn ().

và cuối cùng, chúng ta có thể loại bỏ hàm giải thích giả someFucntionName và nhận được kết quả mong muốn,

buildString {

    append("<")

    append("MindOrks")

    append(">")

}

Ở đây, bạn có thể thấy rằng chúng ta không sử dụng trình tạo một cách rõ ràng. Ở đây nó cung cấp tham chiếu của StringBuilder trong lambda. Chúng ta cũng có thể gọi các thuộc tính của StringBuilder bằng cách sử dụng .

Bây giờ, vì chúng ta đang nhận được một hàm mở rộng, chúng ta cần thay thế hàm buildString bằng hàm sau:

fun buildString(action: (StringBuilder).() -> Unit): String {

    val stringBuilder = StringBuilder()

    action(stringBuilder)

    return stringBuilder.toString()

}

Ở đây, bạn chỉ có thể thấy một sự khác biệt, chúng ta đã thay đổi mã từ (StringBuilder) -> Đơn vị thành (StringBuilder) . () -> Đơn vị .

Nếu bạn nhớ đoạn mã tạo hàm mở rộng ở trên, bạn sẽ nhận thấy rằng chúng ta chỉ đang tạo về cơ bản một hàm có kiểu () -> Unit StringBuilderbộ thu mà không chỉ định rõ ràng tên.

Vì vậy, đây là cách bạn có thể tạo lambda với bộ thu. Chúng hữu ích trong việc tạo DSL trong Kotlin.

>>> Đọc thêm: Hằng số trong PHP - Mọi thông tin mà bạn cần biết về hằng số

>>> Tham khảo: Khóa học lập trình tại T3H