我有一个包含EditText的Activity。通过以下方式导入:
import kotlinx.android.synthetic.main.myActivity.*
我想使用with
函数,但由于某些原因,只能访问其他作用域:
apply
,also
,run
,runCatching
,takeIf
和takeUnless
,但未显示with
(和是的,我向下滚动甚至输入了它。如果这样做,它会标记为“未知”。
为了澄清,这是实际发生的情况:
是否有规则规定对象何时具有这些功能?
答案 0 :(得分:2)
这是因为当apply
时,also
,run
,runCatching
,takeIf
,takeUnless
和with
是扩展名是具有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
是扩展名的源类型。