@guijiu (taka kuwa)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Kotlinの公式ドキュメントを写経し、単一式にreturnを使うとエラーがでてしまう

解決したいこと

Kotlinのドキュメントを写経しながら読んでいますが、エラーが出てしまいます。
何がおかしいのか教えてください。

Kotlin公式ドキュメントのFunctionsの項目:
Single-expression functions(単一式関数)の中に以下の記述があります。

If you use a return statement inside an expression body, you must specify the return type explicitly:
(和訳)式本体内で return 文を使用する場合は、戻り値の型を明示的に指定する必要があります:

fun getDisplayNameOrDefault(userId: String?): String =
    getDisplayName(userId ?: return "default")
    

エラーの状況

このコードをintellijに書くと、returnの部分に赤下線が表示されます。(下のハードコピーをクリックすると拡大し、見やすくなります。)
image.png

またコンパイルをすると以下のようにエラーを吐き出します。

Kotlin: Returns are prohibited in functions with expression body. Use block body '{...}'.
式本体を伴う関数では、戻り値は使用できません。ブロック本体「{...}」を使用してください。

本文やIDEの指摘の通りgetDisplayNameOrDefault関数の戻り値型はStringになっていますが、何がおかしいのでしょうか?
ちなみに、returnの語を削除してしまえば、正常に動きます。ただし、userIdがnullのときgetDisplayNameOrDefault関数の処理を途中で切上げることなく、getDisplayName関数へと処理が進んでしまいます。

試験用のコード

上のコードにあるgetDisplayName()関数は自分で想像して以下のように書きました。

// a.本文中のコード(単一式関数形式)
   fun getDisplayNameOrDefault(userId: String?): String = getDisplayName(userId ?: return "default")

// b.returnを削除し、正常動作すると思われるコード
// fun getDisplayNameOrDefault(userId: String?): String = getDisplayName(userId ?: "default" )

// c.基本的な{}ブロックを用いた記述方法でのコード
// fun getDisplayNameOrDefault(userId: String?): String {
//    return getDisplayName(userId ?: return "default")
//}

// 次の関数は想像して作りました。
fun getDisplayName(userId:String) :String {
    println("getDisplayName関数を通過")   // getDisplayName関数を通過
    return userId
}

fun main(){
    println( getDisplayNameOrDefault("abc"))    // abc
    println()
    println( getDisplayNameOrDefault(null))     // default

// 動作結果の表示(プリントデバッグ)
// bのreturnを削除し、正常動作すると思われるコードを利用した時
    // getDisplayName関数を通過
    // abc
    //
    // getDisplayName関数を通過
    // default

    
// cの基本的な{}ブロックを用いた記述方法でのコードを利用した時
    // getDisplayName関数を通過
    // abc
    //
    // default
}

ご教示のほど、よろしくお願いします。

0 likes

1Answer

リンク先はv2.4.20とありますが、ユーザーさんはなんのバージョンを使ってますか?

試したところ2.4以前ではエラーになりますが、2.4からはエラーになりません

1Like

Comments

  1. @guijiu

    Questioner

    kotlinコンパイラのバージョンのことでしょうか。
    確認したところ、言語バージョン、APIバージョンとも2.2になっていました。
    これをご教示のとおり2.4に変更した所、正常動作を確認しました。
    ありがとうございました。
    (初めて、言語のバージョンの違いに引っかかりました。)
    image.png

Your answer might help someone💌