2017-11-25 145 views
5

Mam następującą metodę. Jego logika jest bardzo prosta, jeśli ustawiono prawe, to wywołanie lewe, gdy ma wartość (nie ma wartości null). Kiedy piszę to w następujący sposób, to działa.Kompilator Kotlina nie może stwierdzić, że zmienna nie jest pusta w pętli do-while.

fun goNext(from: Node): Node? { 
    var prev : Node = from 
    var next : Node? = from.right 
    if (next != null) { 
     prev = next 
     next = next.left 
     while (next != null) { 
      prev = next 
      next = next.left 
     } 
    } 
    return prev 
} 

Jeśli natomiast staram się skrócić kod za pomocą pętli do-while, to już nie mądry rzuca next do Node. To pokazuje ten błąd:

Type mismatch. 
Required: Node<T> 
Found: Node<T>? 

Kod następująco:

fun goNext(from: Node): Node? { 
    var prev : Node = from 
    var next : Node? = from.right 
    if (next != null) { 
     do { 
      prev = next // Error is here, even though next can't be null 
      next = next.left 
     } while (next != null) 
    } 
    return prev 
} 
+2

Dlaczego nie upraszcza się po prostu 'while (next! = Null) {...}'? –

+0

Masz rację! Nie widziałem tego. – biowep

Odpowiedz

-1

Kompilator prawdopodobnie zakłada, że ​​w przyszłym może być zmieniana między if i pętli z innego wątku. Ponieważ możesz zapewnić, że następny nie jest pusty, po prostu dodaj !! do następnego, gdy użyjesz go w pętli: next !!

+0

Następnie może zmienić również stan podczas warunku i przynależności 'prev = next' – biowep

+0

@biowep prev = next !! powinien pasować, czyż nie? – Zonico

+0

Oczywiście, robi to, ale jest to praca wokół niespójnego zachowania, także wprowadza niepotrzebną kontrolę. – biowep