2017-04-07 6 views
4

Wer weiß, warum der folgende Code nicht funktioniert?Kotlin Unwrapping Funktion Compiler Fehler

private fun wrapLogIfNeeded(buildMessageOnCurrentThread: Boolean, log:() -> String):() -> String 
    return if(buildMessageOnCurrentThread) { 
    val message = log() // Type mismatch: Required() -> String Found: Unit 
    { message } 
    } 
    else { 
    log 
    } 
} 

Aber das tut:

private fun wrapLogIfNeeded(buildMessageOnCurrentThread: Boolean, log:() -> String):() -> String 
    return if(buildMessageOnCurrentThread) { 
    val message = lazy { log() }.value 
    { message } 
    } 
    else { 
    log 
    } 
} 

Antwort

6

, dass wegen der Syntax Mehrdeutigkeit ist:

val message = log() 
{ message } 

Dieser Code analysiert wird, als ob es val message = log() { message } war, das heißt, log mit dem Lambda genannt { message } als sein Argument. Und die Anweisung val message = ... hat den Typ Unit, daher die Fehlermeldung.

es zu beheben, können Sie ein Semikolon hinzufügen:

val message = log(); 
{ message } 
+1

Als Alternative zu einem Semikolon, können Sie das Lambda ersetzen können '{Nachricht}' mit einer [anonymen Funktion] (https: // kotlinlang. org/docs/reference/lambdas.html # anonyme Funktionen): 'fun() = message'. – mfulton26

Verwandte Themen