В приведенном ниже коде:
var verticesCount: Int // to read a vertices count for graph // Reading until we get a valid vertices count. while (!Assertions.checkEnoughVertices( verticesCount = consoleReader.readInt(null, Localization.getLocStr("type_int_vertices_count")))) // The case when we don't have enough vertices. println(String.format(Localization.getLocStr("no_enough_vertices_in_graph"), Assertions.CONFIG_MIN_VERTICES_COUNT)) val resultGraph = Graph(verticesCount)
мы получаем следующую ошибку на последней строке:
Error:(31, 33) Kotlin: Variable 'verticesCount' must be initialized
Assertions.checkEnoughVertices принимает переменную безопасного типа в качестве аргумента (verticesCount: Int), поэтому невозможно, чтобы вершины были неинициализированы или null здесь (и мы не получаем соответствующих ошибок в этих строках).
Что происходит на последней строке, когда уже инициализированная переменная снова становится неинициализированной?
Синтаксис, который вы использовали, обозначает вызов функции с именованными аргументами , а не назначение локальной переменной. Итак, verticesCount =
просто объяснение читателю, что значение, которое передается здесь для checkEnoughVertices
соответствует параметру этой функции с именем verticesCount
. Он не имеет ничего общего с локальной переменной с именем verticesCount
объявленной чуть выше, поэтому компилятор считает, что вы все еще должны инициализировать эту переменную.
В Kotlin присвоение переменной ( a = b
) не является выражением, поэтому оно не может использоваться как значение в других выражениях. Вы должны разделить назначение и условие while-loop для достижения того, чего хотите. Я сделал бы это с бесконечным циклом + условие внутри:
var verticesCount: Int while (true) { verticesCount = consoleReader.readInt(...) if (Assertions.checkEnoughVertices(verticesCount)) break ... } val resultGraph = Graph(verticesCount)