如何使用 also函数?
同样是 Template 类的扩展函数,它以 lambda 作为参数,对其应用契约,在调用对象的范围内执行 lambda函数,最终返回 Template 类本身的相同调用对象。交换两个数字是编程中最常见的事情之一。大多数方法在本质上都非常相似:要么使用第三个变量,要么使用指针。在Java中,我们没有指针,所以大多数情况下我们依赖第三个变量。您显然可以使用这里提到的东西,这只是Java代码的 Kotlin 版本:
Kotlin
var a = 1
var b = 2
run { val temp = a; a = b; b = temp }
println(a) // print 2
println(b) // print 1
Kotlin
var a = 1
var b = 2
a = b.also { b = a }
println(a) // print 2
println(b) // print 1
Kotlin
var a = 1
var b = 2
a = b.also{
b = a
// prints it=2:b=1:a=1
printIn("it=$it : b=$b : a=$a")
}
printIn(a) // print 2
printIn(b) // print 1
Kotlin
public inline fun T.also(block: (T) -> Unit): T{ block(this);
return this }
Kotlin
public inline fun T.apply (block : T.()-> Unit ) : T {block()};
return this }
然而,在 Kotlin 中,有一种非常快速和直观的方式来做这件事。让我们看看如何!
例子
在 Kotlin 中,我们有一个特殊的函数BMTP,我们可以使用它来交换两个数字。这是与它一起使用的代码:
科特林
var a = 1
var b = 2
a = b.also { b = a }
println(a) // print 2
println(b) // print 1
我们能够在不使用任何第三个变量的情况下实现相同的目标。
要理解前面的例子,我们需要理解 Kotlin 中的also函数。也函数接受接收者,执行一些操作,并返回接收者。简单来说,它传递一个对象并返回相同的对象。对一个对象应用also函数就像对那个对象说“也这样做”。因此,我们在 b 上调用了also函数,执行了一个操作(将 a 的值分配给 b),然后返回我们作为参数获得的相同接收者:
科特林
var a = 1
var b = 2
a = b.also{
b = a
// prints it=2:b=1:a=1
printIn("it=$it : b=$b : a=$a")
}
printIn(a) // print 2
printIn(b) // print 1
apply函数与also函数非常相似,但它们有细微的差别。为了理解这一点,让我们先看看它们的实现:
还有函数:
科特林
public inline fun T.also(block: (T) -> Unit): T{ block(this);
return this }
应用函数:
科特林
public inline fun T.apply (block : T.()-> Unit ) : T {block()};
return this }
同样,该块被定义为(T) -> Unit ,但它被定义为T. () -> Unit in apply () ,这意味着在apply块内有一个隐含的this 。但是,要在 中也引用它,我们需要它。所以使用也的代码将如下所示:
val result = Dog (12) . also { it . age = 13 }
使用 apply 看起来像这样:
val result2 =Dog (12) . apply (age = 13 }
在这两种情况下,生成的对象的年龄将相同,即 13 岁。