Kotlin 中带有接收器的函数字面量
在 Kotlin 中,函数是一等公民。这意味着函数可以分配给变量,作为参数传递,或者从另一个函数返回。虽然 Kotlin 是静态类型的,但为了使其成为可能,函数需要具有类型。它存在并且被称为函数类型,它们是:
- val wish: ()->Unit
- val sum: (Int)->Int
- val something: ()->()->Unit
本文的先决条件:
- 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 中的扩展函数。以下是它的语法:
receiver . functionLliteral (arguments) -> ReturnType