如果我们已经可以使用apply、run、also和let,我们什么时候还需要在Kotlin中使用with?谁能给予我一个明确的例子?
apply
run
also
let
with
6ss1mwsb1#
在大多数情况下,with调用可以转换为run,如下所示:
with(foo) { // some code ... } // is the same as: foo.run { // the same code ... }
run和with都将返回lambda结果,并且将使用foo作为lambda接收器。然而,我可以想到一个这样做不起作用的情况-当foo声明它自己的run方法时,该方法接受lambda,例如。
foo
// having something like this isn't too uncommon, right? fun run(x: () -> Unit) {}
lambda类型不必与作用域函数run完全相同。任何函数类型都可以。这样重载解析就不会解析为内置的run。您可以通过执行一些强制转换来强制解决问题,但在这种情况下使用with会更好。您不同意吗?
ffscu2ro2#
我认为没有比with(context)更好的例子了。也许我们不清楚英语是否是你的主要语言之一,但是当对象被用来产生结果但不是主要参与者时,它在语义上被翻译成英语比context.run清楚得多,所以它使代码更容易阅读。当然,这就引出了为什么run存在的问题。在英语中,当宾语是做动作的东西时,它在语义上更有意义。在英语中,动作的上下文是你正在做什么。但是,如果宾语是直接产生结果的东西,那么它就是在运行动作。而且,你不能做?.with。
with(context)
context.run
?.with
2条答案
按热度按时间6ss1mwsb1#
在大多数情况下,
with
调用可以转换为run
,如下所示:run
和with
都将返回lambda结果,并且将使用foo
作为lambda接收器。然而,我可以想到一个这样做不起作用的情况-当
foo
声明它自己的run
方法时,该方法接受lambda,例如。lambda类型不必与作用域函数
run
完全相同。任何函数类型都可以。这样重载解析就不会解析为内置的run
。您可以通过执行一些强制转换来强制解决问题,但在这种情况下使用
with
会更好。您不同意吗?ffscu2ro2#
我认为没有比
with(context)
更好的例子了。也许我们不清楚英语是否是你的主要语言之一,但是当对象被用来产生结果但不是主要参与者时,它在语义上被翻译成英语比context.run
清楚得多,所以它使代码更容易阅读。当然,这就引出了为什么
run
存在的问题。在英语中,当宾语是做动作的东西时,它在语义上更有意义。在英语中,动作的上下文是你正在做什么。但是,如果宾语是直接产生结果的东西,那么它就是在运行动作。而且,你不能做
?.with
。