在Kotlin中使用“apply”、“run”、“also”或“let”无法实现的“with”函数是否有用处?

deikduxw  于 2022-11-25  发布在  Kotlin
关注(0)|答案(2)|浏览(116)

如果我们已经可以使用applyrunalsolet,我们什么时候还需要在Kotlin中使用with
谁能给予我一个明确的例子?

6ss1mwsb

6ss1mwsb1#

在大多数情况下,with调用可以转换为run,如下所示:

with(foo) {
    // some code ...
}

// is the same as:

foo.run {
    // the same code ...
}

runwith都将返回lambda结果,并且将使用foo作为lambda接收器。
然而,我可以想到一个这样做不起作用的情况-当foo声明它自己的run方法时,该方法接受lambda,例如。

// having something like this isn't too uncommon, right?
fun run(x: () -> Unit) {}

lambda类型不必与作用域函数run完全相同。任何函数类型都可以。这样重载解析就不会解析为内置的run
您可以通过执行一些强制转换来强制解决问题,但在这种情况下使用with会更好。您不同意吗?

ffscu2ro

ffscu2ro2#

我认为没有比with(context)更好的例子了。也许我们不清楚英语是否是你的主要语言之一,但是当对象被用来产生结果但不是主要参与者时,它在语义上被翻译成英语比context.run清楚得多,所以它使代码更容易阅读。
当然,这就引出了为什么run存在的问题。在英语中,当宾语是做动作的东西时,它在语义上更有意义。在英语中,动作的上下文是你正在做什么。但是,如果宾语是直接产生结果的东西,那么它就是在运行动作。
而且,你不能做?.with

相关问题