Kotlin:申请vs With

n9M*_*tq4 59 kotlin

和申请有什么区别.据我所知,下面的代码做了同样的事情:

swingElement.apply {
    minWidth = ENABLED_COLUMN_WIDTH
    maxWidth = ENABLED_COLUMN_WIDTH
    preferredWidth = ENABLED_COLUMN_WIDTH
}
with(swingElement) {
    minWidth = ENABLED_COLUMN_WIDTH
    maxWidth = ENABLED_COLUMN_WIDTH
    preferredWidth = ENABLED_COLUMN_WIDTH
}
Run Code Online (Sandbox Code Playgroud)

有什么区别,我应该使用一个吗?此外,是否有一些情况下,一个人会工作,另一个不会?

Mic*_*ael 66

有两点不同:

  1. apply接受一个实例作为接收器,同时with需要将一个实例作为参数传递.在这两种情况下,实例都将成为this一个块.

  2. apply返回接收器并with返回其块中最后一个表达式的结果.

我不确定可以选择哪种功能的严格规则.通常apply在需要对某个对象执行某些操作并将其返回时使用.当你需要对一个对象执行一些操作并返回一些其他对象时,你可以使用with或者run.我更喜欢,run因为在我看来它更具可读性,但这是一个品味问题.

  • 使用可空接收器可以更好地应用:`foo?.apply {/*也许做点什么*/}` (14认同)
  • 好点子。“跑”也不错。对我来说,“with”绝对没用。我不在我的代码中使用它。 (2认同)

s1m*_*nw1 8

apply功能

//returns receiver T, T exposed as `this`
fun <T> T.apply(block: T.() -> Unit): T 
Run Code Online (Sandbox Code Playgroud)

描述

apply函数在接收器上调用,接收器Tthis在传递的lambda表达式中公开.接收器也成为apply自动的结果.

with功能

//return arbitrary value R, not an extension function, T exposed as `this` 
fun <T, R> with(receiver: T, block: T.() -> R): R 
Run Code Online (Sandbox Code Playgroud)

描述

with功能,而不是所有其他范围的函数(let,run,also,apply),则没有被定义为一个扩展函数.相反,使用接收器对象作为其第一个参数显式调用该函数.同样apply,接收器暴露this在传递的lambda中.lambda的结果,即它的最后一个语句,成为结果(R)with.

  • 我猜OP想知道用例差异,例如选择一个而不是描述的上下文示例 (2认同)

Afr*_*uit 6

这是相同点和不同点

相似之处

WithApply都以任何方式接受一个对象作为接收者。

差异

With返回 lambda 中的最后一行作为表达式的结果。

Apply返回作为 lambda 表达式结果作为接收者传入的对象。

例子

private val ORIENTATIONS = with(SparseIntArray()) {
    append(Surface.ROTATION_0, 90)
    append(Surface.ROTATION_90, 0)
    append(Surface.ROTATION_180, 270)
    append(Surface.ROTATION_270, 180)
}
ORIENTATIONS[0] // doesn't work 
// Here, using with prevents me from accessing the items in the SparseArray because, 
// the last line actually returns nothing
Run Code Online (Sandbox Code Playgroud)

申请

private val ORIENTATIONS = SparseIntArray().apply {
    append(Surface.ROTATION_0, 90)
    append(Surface.ROTATION_90, 0)
    append(Surface.ROTATION_180, 270)
    append(Surface.ROTATION_270, 180)
}
ORIENTATIONS[0] // Works
// Here, using apply, allows me to access the items in the SparseArray because, 
// the SparseArray is returned as the result of the expression
Run Code Online (Sandbox Code Playgroud)