2017-04-07 15 views
4

次のコードが機能しない理由を知っていますか?ラムダと呼ばれるそれはval message = log() { message }だったかのようにKotlinアンラッピング関数コンパイラエラー

val message = log() 
{ message } 

このコードは解析されます、つまり、log

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

しかし、この処理が行われます。

ための構文あいまいさのためです
private fun wrapLogIfNeeded(buildMessageOnCurrentThread: Boolean, log:() -> String):() -> String 
    return if(buildMessageOnCurrentThread) { 
    val message = lazy { log() }.value 
    { message } 
    } 
    else { 
    log 
    } 
} 

答えて

6

{ message }を引数にとります。そして文val message = ...はタイプUnitを持っています。そのため、エラーメッセージが表示されます。それを解決するには

、あなたはセミコロンを追加することができます:// kotlinlang:セミコロンの代わりとして

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

を、あなたは[匿名関数](httpsで 'ラムダ' {メッセージ}を置き換えることができます。 org/docs/reference/lambdas.html#anonymous-functions): 'fun()= message'です。 – mfulton26

関連する問題