📜  Kotlin 中带有接收器的函数字面量

📅  最后修改于: 2022-05-13 01:54:50.053000             🧑  作者: Mango

Kotlin 中带有接收器的函数字面量

在 Kotlin 中,函数是一等公民。这意味着函数可以分配给变量,作为参数传递,或者从另一个函数返回。虽然 Kotlin 是静态类型的,但为了使其成为可能,函数需要具有类型。它存在并且被称为函数类型,它们是:

本文的先决条件:

  • Kotlin 中的函数
  • Kotlin 中的函数引用
  • Kotlin 中接收器的基本概念

函数引用是反射的一个例子。它返回对函数的引用,该函数还实现了表示函数类型的接口。这就是为什么它可以这样使用。通常,编程中的字面量是语法糖的立方体,用于表示语言认为特别重要的某些类型的值。因此,函数字面量量是一种特殊符号,用于简化函数的定义方式。 Kotlin 中有两种类型的函数字面量:

  • Lambda 表达式(这是一种定义函数的简短方法。)
  • 匿名函数(它是定义函数的另一种方法。)

介绍

函数字面量量是未声明但作为表达式传入的函数。 Lambda 和匿名函数是函数字面量。在 Kotlin 中,我们可以使用接收器对象调用函数字面量量,并且可以在函数字面量量的主体内调用接收器对象上的方法,就像扩展函数一样。在本文中,我们将学习如何在接收器中使用函数字面量。

示例:按照以下步骤理解函数字面量:

让我们从字符串上的简单函数字面量开始,它返回一个添加到接收者字符串的字符串:

Kotlin
fun main (args: Array) {
  var s = "gonna do "
  val addS = fun String. (successor: String) : String {
    return this + successor
  }
  s = s . addS ("nothing much.")
  printIn (s)
}


Kotlin
fun main (args: Array) {
  var s = "gonna do "
  val addS = fun String. (successor: String) : Int {
    return this . length + successor . length
      }
    var x = s. addS ("nothing  much.")
    printin (x)
    fun testIfEqual (op: (String, String) -> Int, a: String, b:String, c: Int) =
  assert (op (a, b) == c)
    test IfEqual (addS, "gonna do ","nothing much. ",
                  s . length + "nothing     much.". length)
}


函数字面量量可以访问它被调用的接收器,并且它可以访问与该接收器关联的方法。我们也可以在普通函数中将接收器作为参数传递,其中第一个参数是接收器。这在我们需要使用普通函数So String 的场景中很有用。 (String) -> Int 类似于 (String, String) -> Int 兼容。查看以下示例:

科特林

fun main (args: Array) {
  var s = "gonna do "
  val addS = fun String. (successor: String) : Int {
    return this . length + successor . length
      }
    var x = s. addS ("nothing  much.")
    printin (x)
    fun testIfEqual (op: (String, String) -> Int, a: String, b:String, c: Int) =
  assert (op (a, b) == c)
    test IfEqual (addS, "gonna do ","nothing much. ",
                  s . length + "nothing     much.". length)
}

如果可以推断接收器类型,则 lambda 可以用作函数字面量量。所以基本上,我们可以在接收者对象上调用函数字面量量,在函数体内部,我们可以访问和调用接收者对象上的方法,类似于 Kotlin 中的扩展函数。以下是它的语法: