Kotlin范围函数(Android EditText支持* apply *,* let *和* run *但不支持* with *)

缥帙各舒散,前后互相逾。这篇文章主要讲述Kotlin范围函数:Android EditText支持* apply *,* let *和* run *但不支持* with *相关的知识,希望能为你提供帮助。
我有一个包含EditText的Activity。进口途径:

import kotlinx.android.synthetic.main.myActivity.*

我想使用with函数但由于某种原因只能访问其他作用域函数:
Kotlin范围函数(Android EditText支持* apply *,* let *和* run *但不支持* with *)

文章图片

显示applyalsorunrunCatchingtakeIftakeUnless,但不是with(是的,我向下滚动甚至打出来。如果我这样做,它标记为未知)。
为了澄清,这里实际发生了什么:
Kotlin范围函数(Android EditText支持* apply *,* let *和* run *但不支持* with *)

文章图片

对象何时具有这些功能以及何时不具有规则?
答案这是因为当apply具有2个参数时,alsorunrunCatchingtakeIftakeUnlesswith是扩展。 Here是关于此的好文章。
你可以像这样使用with
with(editText) { //your code }

但你不能打电话给with,因为你试图这样做:
editText.with() //compilation error

更新:with函数的目的是更容易调用对象方法,你不需要写这样的东西:
someObject.a(); someObject.b(); someObject.c(); //etc

当你使用with时,你可以像这样写:
with(someObject) { a(); b(); c(); //etc }

另一答案您没有得到任何有关函数的建议,因为它没有源类型作为扩展名,而其他扩展包含附加到它的源。怎么样?
看看下面的区别:
【Kotlin范围函数(Android EditText支持* apply *,* let *和* run *但不支持* with *)】有功能
@kotlin.internal.InlineOnly public inline fun < T, R> with(receiver: T, block: T.() -> R): R { ... return receiver.block() }

让功能
@kotlin.internal.InlineOnly public inline fun < T, R> T.let(block: (T) -> R): R { ... return block(this) }

这里T是扩展的源类型。

    推荐阅读