Kotlin范围界定功能:Android EditText支持* apply *,* let *和* run *,但不支持* with *

时间:2019-04-16 12:52:12

标签: kotlin

我有一个包含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

是否有规则规定对象何时具有这些功能?

2 个答案:

答案 0 :(得分:2)

这是因为当apply时,alsorunrunCatchingtakeIftakeUnlesswith是扩展名是具有2个参数的函数。 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
}

答案 1 :(得分:2)

对于使用功能的功能,您没有任何建议,因为它没有作为扩展名的源类型,而其他扩展名中都包含与之相关的源。怎么样?

看看下面的区别:

具有功能

@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是扩展名的源类型。