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
}
차이점이 있으며 다른 하나를 사용해야합니까? 또한 하나는 작동하고 다른 하나는 작동하지 않는 경우가 있습니까?
두 가지 차이점이 있습니다.
apply
는 인스턴스를 수신자로 받아들이고with
인스턴스를 인수로 전달해야합니다. 두 경우 모두 인스턴스는this
블록 내에 있게 됩니다.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
됩니다.
유사점과 차이점은 다음과 같습니다.
유사점
With 및 Apply는 모두 전달되는 방식에 관계없이 객체를 수신자로 허용합니다.
차이점
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
'IT Share you' 카테고리의 다른 글
System.Web.Http.Authorize 대 System.Web.Mvc.Authorize (0) | 2020.12.12 |
---|---|
.NET 프레임 워크의 "application / json"상수 (0) | 2020.12.12 |
Django 및 Restful API (0) | 2020.12.12 |
클래스 본문에 선언 된 Ruby 메서드 호출 (0) | 2020.12.12 |
터치 시대의 툴팁 (0) | 2020.12.12 |