2016-07-07 12 views
2
次のコードで

:我々は最後の行に次のエラーを取得しているKotlinのwhile条件体で変数を初期化することは可能ですか?

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)などの安全な型の変数を受け入れ、 verticesCountが初期化されていないか、ここではnullになることは不可能です(これらの行には対応するエラーはありません)。

すでに初期化された変数がもう一度初期化されない場合、最後の行はどうなりますか?

+0

はAssertions.checkEnoughVertices'は 'verticesCount'という名前のパラメータを持って'していますか? – marstran

+0

@marstranはい、それはこのメソッドの唯一のパラメータです –

答えて

4

構文は、named argumentsの関数呼び出しであり、ローカル変数の代入ではありません。したがって、verticesCount =は、ここでcheckEnoughVerticesに渡されている値が、verticesCountという名前のその関数のパラメータに対応するという読者の説明に過ぎません。上に宣言したローカル変数verticesCountとは関係がないので、コンパイラはあなたがまだその変数を初期化していると考えます。 Kotlinで

、変数(a = b)への割り当ては、ない式であるので、他の式の値として使用することができません。あなたはあなたが望むことを達成するために、割り当てとwhileループ条件を分割する必要があります。私は無限ループ+内部の状態でこれを行うだろう:

var verticesCount: Int 

while (true) { 
    verticesCount = consoleReader.readInt(...) 
    if (Assertions.checkEnoughVertices(verticesCount)) break 

    ... 
} 

val resultGraph = Graph(verticesCount) 
+0

提案されている解決策を使って、非常に完全で直接的な答えです。説明されたケースは今私にとって明らかです。 –

+0

無限ループの代わりに "do while"を使いこなす必要がありますか? –

関連する問題