IT Share you

Kotlin : 적용 대 사용

shareyou 2020. 12. 12. 12:41
반응형

Kotlin : 적용 대 사용


with와 apply의 차이점은 무엇입니까? 내가 아는 바에 따르면 다음 코드는 동일한 작업을 수행합니다.

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
}

차이점이 있으며 다른 하나를 사용해야합니까? 또한 하나는 작동하고 다른 하나는 작동하지 않는 경우가 있습니까?


두 가지 차이점이 있습니다.

  1. apply는 인스턴스를 수신자로 받아들이고 with인스턴스를 인수로 전달해야합니다. 두 경우 모두 인스턴스는 this블록 내에 있게 됩니다.

  2. apply수신자를 with반환하고 블록 내 마지막 표현식의 결과를 반환합니다.

어떤 기능을 선택할지에 대한 엄격한 규칙이있을 수 있을지 모르겠습니다. 일반적으로 apply객체로 무언가를 수행하고 반환해야 할 때 사용 합니다. 객체에 대해 몇 가지 작업을 수행하고 다른 객체를 반환해야 할 때 with또는을 사용할 수 있습니다 run. run제 생각에는 가독성이 더 좋기 때문에 선호 하지만 맛의 문제입니다.


apply기능

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

기술

apply함수는 호출 수신기 T로 노출되며, this전달 된 람다 식이다. 수신자도 apply자동으로 결과가 됩니다.

with기능

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

기술

with다른 범위 함수 달리 함수 ( let, run, also, apply)이며, 확장 함수로 정의되지 . 대신이 함수는 수신자 객체를 첫 번째 인수로 명시 적으로 호출합니다. 와 마찬가지로 apply수신자는 this전달 된 람다에서 와 같이 노출됩니다 . 람다의 결과, 즉 마지막 명령문이의 결과 ( R)가 with됩니다.


유사점과 차이점은 다음과 같습니다.

유사점

WithApply는 모두 전달되는 방식에 관계없이 객체를 수신자로 허용합니다.

차이점

With 는 식의 결과로 람다의 마지막 줄을 반환합니다.

Apply 는 람다 식의 결과로 수신자로 전달 된 개체를 반환합니다.

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

대다

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

참고 URL : https://stackoverflow.com/questions/36625329/kotlin-apply-vs-with

반응형