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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin范围函数:Android EditText支持* apply *,* let *和* run *但不支持* with *相关的知识,希望对你有一定的参考价值。

我有一个包含EditText的Activity。进口途径:

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

我想使用with函数但由于某种原因只能访问其他作用域函数:

apply, also, run, runCatching, takeIf and takeUnless are shown, but not with

显示applyalsorunrunCatchingtakeIftakeUnless,但不是with(是的,我向下滚动甚至打出来。如果我这样做,它标记为未知)。

为了澄清,这里实际发生了什么:

Unresolved reference: 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.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是扩展的源类型。

以上是关于Kotlin范围函数:Android EditText支持* apply *,* let *和* run *但不支持* with *的主要内容,如果未能解决你的问题,请参考以下文章

使用Kotlin开发Android应用

Android:Kotlin详细入门学习指南-函数-基础语法

Android:Kotlin详细入门学习指南-高阶函数-基础语法

Android:Kotlin详细入门学习指南-高阶函数-基础语法

Android[Kotlin] - 错误 TypeError: ["Android"].showToast 不是函数

Android - Kotlin:异步返回值