2016-10-19 4 views
1

나는 어느 곳에서나 모든 사람들이 그것에 빠져 들어가야 만하는 매우 단순한 문제를 만났지만 어느 곳에서나 솔루션을 찾지 못했습니다.int 및 int 추가? in Kotlin

var a : Int = 1 
var c : Int? = 3 

a + if (c != null) {c} else {0} 
ERROR: None of the following functions can be called with supplied argument (followed by the various implementations of kotlin.int.plus()) 

그래서 함께 지능과 지능을 추가 난 할 노력하고있어입니다 :

는 REPL에서 복사? 그 결과가 Int가되고 싶습니다. 아주 간단합니다. 물론 !! 연산자에 대해 알고 있지만, 변경 안전 †이 아니므로 가능할 때마다이 연산자를 사용하지 않는 것이 좋습니다.

a + if (c != null) {c!!} else {0} 
4 

내가 널 안전을 처리하고 !! 연산자의 사용을 피할 다음과 같은 솔루션, 알고있다.

a + (c ?: 0) 
4 

내 질문은 다음과 같은 경우 : !! 연산자의 사용을 요구하지 않는 경우 - 다른 블록의 사용 및/또는 블록에 추가 할 수있는 방법이 있나요. Elvis 연산자가 아닌 if-else의 사용을 선호하는 이유는 Elvis 연산자가없는 언어의 사람들에게 명료합니다. 그래서 나는 가능한 한 a + if (c != null) {c} else {0}에 가깝게하고 싶습니다.

내 문제 또는 동기가 명확하지 않거나 Kotlin의 의도 또는 의도에 위배되는 경우 고맙습니다. 알려 주시기 바랍니다.

† 내가 추가 할 때 일부 변수가 안전하다고 주장 할 수도 있지만이 코드는 주변 코드가 변경 될 때도 그대로 남아 있기 때문에 어설 션을 무효로 만들 수 있으므로 Kotlin의 포인트 중 하나가 무효화됩니다 : 안전을 보장하지 않습니다.

답변

2

문제는 kotlin이 변수가 연산 사이에서 값을 변경할 수있는 방법이 없다면 null 검사 후에 변수가 null이 아닌 것으로 가정 할 수 있다는 것입니다.

정확히 REPL이 구현 된 방법을 모르지만 내 생각에 변수는 컨텍스트 클래스에 멤버로 삽입됩니다. 즉, 컴파일러는 다른 스레드가 작업간에 값을 변경할 수 있으므로 변경이 발생할 수 없다고 가정 할 수 없습니다.

그래서이 기능은 REPL에서 작동하지 않는 것처럼 보이지만 elvis 연산자는 꽤 깨끗한 대안입니다.

+1

와우, 실제로 이것이 REPL 특정 문제가 될 것이라고 기대하지 않았습니다. null 체크는 함수에서 사용될 때 실제 작업을 수행합니다. 그래서'var d = a + if (c! = null) {c} else {0};은 함수에서 작동합니다. 나는 물건을 테스트하고 Kotlin의 다양한 단점을 찾기 위해 REPL을 사용 해왔다. 나는 적절한 프로그램에서 그렇게해야한다고 생각합니다. 고맙습니다. –

+0

^^ 정확하게. REPL이 전형적인 프로덕션 작업 흐름에 관여하지 않기 때문에 REPL 관련 버그 및 문제점이 수없이 많습니다. – voddan