はじめに
公式の問題集「Kotlin Koans」を解きながらKotlinを学習します。
過去記事はこちら
問題
Javaで foo() のオーバーロードがいくつかあるとします。
public String foo(String name, int number, boolean toUpperCase) {
return (toUpperCase ? name.toUpperCase() : name) + number;
}
public String foo(String name, int number) {
return foo(name, number, false);
}
public String foo(String name, boolean toUpperCase) {
return foo(name, 42, toUpperCase);
}
public String foo(String name) {
return foo(name, 42);
}
これらのJavaのオーバーロードをすべてKotlinの1つの関数に置き換えることができます。
foo関数の宣言を、fooを使ったコードがコンパイルできるように変更します。
デフォルト引数と名前付き引数を使います。
fun foo(name: String, number: Int, toUpperCase: Boolean) =
(if (toUpperCase) name.uppercase() else name) + number
fun useFoo() = listOf(
foo("a"),
foo("b", number = 1),
foo("c", toUpperCase = true),
foo(name = "d", number = 2, toUpperCase = true)
)
上記の修正前コードを実行すると以下のエラーが発生します。
No value passed for parameter 'number'
No value passed for parameter 'toUpperCase'
No value passed for parameter 'toUpperCase'
No value passed for parameter 'number'
引数 'number' 'toUpperCase' に渡された値がないというエラーですね。
問題のポイント
Javaだと関数fooが4つに分かれているのを、デフォルト引数を使って1つの関数で定義します。
引数 'number' 'toUpperCase' を指定しなくても関数fooが呼び出せるように修正します。
解答例
引数 'number' 'toUpperCase' に初期設定を追加しました。
初期設定を追加することで関数fooを呼び出すときに、引数nameだけを指定してfoo("a")
のような関数呼び出しができるようになります。
fun foo(
name: String,
number: Int = 42,
toUpperCase: Boolean = false
) = (if (toUpperCase) name.uppercase() else name) + number