분리 선언
때로는 예를 들어, 객체를 변수에 분리하여 할당하는 것이 편리할 수도 있습니다.
val (name, age) = person
이 구문을 분리 선언 이라고합니다 . 분리 선언은 한 번에 여러 변수를 만듭니다. 우리는 두 개의 새로운 변수를 선언했습니다 : name과
age
, 그리고 독립적으로 사용할 수 있습니다 :
println(name)
println(age)
분리 선언은 다음 코드로 컴파일됩니다.
val name = person.component1()
val age = person.component2()
component1()
와 component2()함수는 코틀린
에서 널리 사용되는 관례 규칙 의 또 다른 예이다 ( + 와
*
, for 루프 와 같은 연산자 참조 ). 필요한 수의 컴포넌트 함수가 호출 될 수있는 한 임의의 것이 분리 선언의 오른쪽에있을 수 있습니다. 그리고 물론 component3()과
component4()
등이 존재 합니다.
분리 선언문에서 componentN()
함수를 사용할 수 있으 려면 함수에 operator
키워드로 표시해야합니다 .
분리 선언은 또한 다음과 같이 for루프에서도 동작합니다.
for ((a, b) in collection) { ... }
변수 a
와 b
값으로 반환받을 component1()
및 component2()
컬렉션의 요소라고합니다.
예 : 함수에서 두 개의 값 반환
함수에서 두 가지를 반환해야한다고 가정 해 보겠습니다. 예를 들어, 결과 개체와 일종의 상태. 코틀린에서 이 작업을 수행하는 간단한 방법은 데이터 클래스 를 선언 하고 인스턴스를 반환하는 것입니다.
data class Result(val result: Int, val status: Status)
fun function(...): Result {
// computations
return Result(result, status)
}
// Now, to use this function:
val (result, status) = function(...)
데이터 클래스는 자동으로 componentN()
함수를 선언하기 때문에 선언을 파기하는 것이 여기에서 가능합니다.
참고 : 우리는 또한 표준 클래스를 사용할 수 있습니다 Pair
및이 function()
수익을 Pair<Int, Status>
하지만 데이터가 제대로 이름을 가지고하는 것이 좋습니다.
예 : 분리 선언 과 맵
맵을 통과하는 가장 좋은 방법은 다음과 같습니다.
for ((key, value) in map) {
// do something with the key and the value
}
이 작업을하려면
맵에서 값의 시퀸스로 iterator()
함수 를 제공합니다. ;각 요소를 component1()
하고component2()함수를 Pair으로 제공합니다.
실제로 표준 라이브러리는 다음과 같은 확장을 제공합니다.
operator fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator()
operator fun <K, V> Map.Entry<K, V>.component1() = getKey()
operator fun <K, V> Map.Entry<K, V>.component2() = getValue()
따라서 지도 (데이터 클래스 인스턴스의 콜렉션뿐만 아니라)를 사용 하여 -loops 에서 destructuring 선언을 자유롭게 사용할 수 있습니다 .
사용하지 않는 변수를 위한 밑줄 (1.1 이후)
분리 선언에 변수가 필요하지 않으면 이름 대신 밑줄을 사용할 수 있습니다.
val (_, status) = getResult()
componentN()
연산자 함수는이 방법으로 건너 뜁니다 구성 요소에 대한 호출되지 않습니다.
람다에서의 분리 선언 (1.1 년 이후)
람다 매개 변수에 대한 분리 선언 구문을 사용할 수 있습니다. 람다에 Pair
유형 의 매개 변수 (또는 Map.Entry
적절한 componentN
함수 가있는 다른 유형)가있는 경우 괄호 안에 넣으면 여러 매개 변수를 새로 추가 할 수 있습니다.
map.mapValues { entry -> "$!" }
map.mapValues { (key, value) -> "$value!" }
두 개의 매개 변수를 선언하고 매개 변수 대신 분리한 쌍을 선언하는 것의 차이점에 유의하십시오.
{ a -> ... } // one parameter { a, b -> ... } // two parameters { (a, b) -> ... } // a destructured pair { (a, b), c -> ... } // a destructured pair and another parameter
분리한 매개 변수의 구성 요소가 사용되지 않은 경우 밑줄로 대체하여 이름을 고안하지 않아도됩니다.
map.mapValues { (_, value) -> "$value!" }
전체 분리한 매개 변수 또는 특정 구성 요소의 유형을 별도로 지정할 수 있습니다.
map.mapValues { (_, value): Map.Entry<Int, String> -> "$value!" }
map.mapValues { (_, value: String) -> "$value!" }
'프로그래밍 > kotlin' 카테고리의 다른 글
코틀린 - 함수 (0) | 2021.04.18 |
---|---|
코틀린 - 고차 함수와 람다 (0) | 2021.04.18 |
코틀린 - 인라인 함수 (0) | 2021.04.18 |
코틀린 - 코루틴 (0) | 2021.04.18 |
컬렉션 : List, Set, Map (0) | 2021.04.18 |