kotlin – lambda函数如:block:E.() – > Unit是什么意思?

从以前的问题我看到,我们可以做这样的扩展:

inline fun  Iterable.withEach(block: E.() -> Unit) { forEach { it.block() } } 

它将代码块应用于每个可迭代项目。

你可以这样称呼它:

 listOf("1000","222").withEach { print(length) } 

所以你可以看到字符串的长度函数在lambda里没有任何引用。

我不清楚有什么用的。 E.可以在块types定义中解释“E.()”的含义

TL; DR

 block: E.() -> Unit 

这代表了一个“ 与接收器的函数文字” 。 这是一个函数参数,函数types为() -> Unit和genericstypesE因为它是接收者 。 为了简单起见,可以将其视为临时扩展函数,只能在withEach该function块中withEach

函数Literals / Lambda与接收器

Kotlin支持“function文字与接收器”的概念。 它允许访问lambda的接收者的可见方法和属性, 而不需要任何特定的限定符 。 这与扩展函数非常相似,在扩展函数中也可以访问扩展中的接收者对象的可见成员。

一个简单的例子,也是Kotlin标准库中最重要的function之一, apply

 public inline fun  T.apply(block: T.() -> Unit): T { block(); return this } 

正如你所看到的,这样一个带有接收者的函数文字就是这里的参数block 。 这个块被简单地执行,接收者(它是T一个实例)被返回。 在行动中,这看起来如下:

 val foo: Bar = Bar().apply { color = RED text = "Foo" } 

我们实例化一个Bar的对象,然后调用它。 Bar的实例成为“接收者”。 作为{} (lambdaexpression式)中的parameter passing的block不需要使用其他限定符来访问和修改显示的可见属性的colortext

带有接收器的lambdas的概念也是用Kotlin编写DSL的最重要的特性。