2017-12-24 20 views
6

Kotlin에서 다른 변수가 null이 아닌 경우에만 할당을 수행하려고합니다 (그렇지 않으면 op가 없음). 두 가지 간결한 방법을 생각해 볼 수 있습니다.오른쪽이 null이 아닌 경우에만 더 좋은 방법을 할당 할 수 있습니까?

그러나 나는 그들이해야하는 빈도를 감안할 때 충분히 간결하지 않습니다. 첫 번째 방법은 과도한 것처럼 보입니다. 두 번째 방법은 ?: 뒤에 표현식을 요구하는 것입니다.

더 좋은 방법이 있어야한다고 생각합니다. n =? x과 같은 것입니까? 또는 n = x?? 거기 있니?

+8

'는 과학 X 작업에서 사용자 정의를 시뮬레이션'보십시오. – yole

답변

0

다음이있다 :

val x: Int? = null 
val n: Int = x ?: return 

n을 할당 할 수 없습니다하더라도 완벽하게 정상적으로 컴파일합니다. '할당'이후에 n을 사용한 통화도 허용됩니다 (예 : n). println(n), 컴파일러는 nInt이라는 것을 알고 있기 때문에 괜찮습니다. 그러나 범위에서 return이기 때문에 할당 후 모든 행은 호출되지 않습니다. 당신이 원하는 것에 따라, 그것은 노 - op입니다. n을 할당 할 수 없어 계속할 수 없으므로 반환하십시오.

또 다른 옵션은 val n: Int = x!!이며 인 경우 NullPointerException을 던집니다. 다른 곳에서 처리해야합니다. Kotlin은 null 허용 여부를 처리 할 수있는 더 명확한 방법을 제공하므로이 방법을 권장하지 않습니다.

+0

제 실제 사용 사례는 다음과 같습니다. Java 라이브러리 맨 위에 래퍼 함수 (Kotlin)를 작성하고 있습니다. 파라미터가 null가 아닌 경우, 그 값은 기본이되는 오브젝트의 대응하는 필드에 할당 할 수 있습니다. 그것이 null의 경우는 아무것도 실시하지 않고, 그 필드의 디폴트 치를 남겨 둡니다. 설정할 필드가 두 개 이상이므로 가운데로 돌아 오는 것은 옵션이 아닙니다. 그래도 조사와 제안에 감사드립니다. –

+1

그러면 원래의 방법 2가 최고라고 생각합니다. 분명하고 짧으며 간단하며 원하는 것을 성취 할 수 있습니다. – Erik

1

은 코 틀린에이 작업을 수행하기위한 전용 구문이 없습니다 infix

// define this 
infix fun <T > T.assignFromNotNull(right: T): T = right ?: this 

/////////////////////////////////////////////////////////// 
// Demo using 

// Now, Kotlin infix-style 
fooA assignFromNotNull fooB 
barA assignFromNotNull barB 
bazA assignFromNotNull bazB 

// Old code, Java if-style 
if (fooB != null) { 
    fooA = fooB; 
} 
if (barB != null) { 
    barA = barB; 
} 
if (bazB != null) { 
    bazA = bazB 
} 
+0

중위 함수 정의로 무엇을하려고하는지 이해합니다. 그러나 Kotlin 코드의 3 줄은 무엇입니까? 분명히 Kotlin의 메타 데이터에 대해 잘 알지 못합니다. –

+0

내 프로젝트에서 데모 코드가 복사되었습니다. 내가 대답을 명확하게하기 위해 청소할 것입니다. – Raymond