LoginSignup
1
0

More than 1 year has passed since last update.

Kotlin KoansでKotlin入門 第3回:Default arguments

Last updated at Posted at 2022-03-07

はじめに

公式の問題集「Kotlin Koans」を解きながらKotlinを学習します。

過去記事はこちら

問題

Default arguments

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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0