📜  如何使用 also函数?

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

如何使用 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 岁。