「Mixing named and positioned arguments is not allowed」は「名前付き引数」の渡し方が原因

Kotlinでコードを書いている時に

「Mixing named and positioned arguments is not allowed」

というエラーで怒られてしまったのでメモ

スポンサーリンク

動作環境

Kotlin version 1.2.50

問題のコード

こんな関数があるとする。

fun makeMoge(
    option: MogeMoge,
    groupId: Long? = null,
    targetUserIds: List? = null,
)

この関数を呼び出そうと、以下のように記述するエラーが起きました。

makeMoge(option, groupId = id, ids)

Mixing named and positioned arguments is not allowed

果たしてこれはなにか・・・?

原因

「名前付き引数」の後に「通常の引数」を渡すと、正しく関数を呼び出すことが出来ない。

以下の2つ目の引数(groupId = id) が「名前付き引数」

makeMoge(option, groupId = id, ids)

関数の定義をもう一度チェックしてみる。

fun makeMoge(
    option: MogeMoge,
    groupId: Long? = null,
    targetUserIds: List? = null,
)

ここで、

「optionを引数として渡した!」
「groupIdを引数として渡した!」
「よし、順番通りList型のidsを通常の引数として渡そう!」

と勘違いしてしまうとエラーが発生する。

文法上、呼び出し側で「名前付き引数」の後に「通常の引数(ids)」を渡す事は出来ない。

正しい呼び出し方

では正しく関数を呼び出すにはどうするか。

OK

makeMoge(option, groupId = id, targetUserIds = ids)

「名前付き引数」の後に、「名前付き引数」を渡せば正しく呼び出せる

OK

makeMoge(option, id, ids)

「名前付き引数」を使わず、「通常の引数」を順番通り正しくセットしても呼び出せる。

OK

makeMoge(option, targetUserIds = ids, groupId = id)

ちなみに、「名前付き引数」なので「関数の定義順番通り」でなくても呼び出せる。

名前付き引数と引数の使い方

おまけで名前付き引数と引数の使い方をおさらい。

この関数で受け取る引数は合計3個。

fun makeMoge(
    option: MogeMoge,
    groupId: Long? = null,
    targetUserIds: List? = null,
)

引数1は「通常の引数」
引数2は「デフォルト引数」
引数3は「デフォルト引数」

この場合、以下のように

makeMoge(option)

これだけで関数が呼び出せます。

「通常の引数」は一つなので、残り2つはデフォルトの「null」が入り関数が呼び出せますね。

「引数2」を省略し、「引数1」と「引数3」を渡したい場合

通常

通常は関数定義した引数の順番通りに引数を渡していく。

そのため「引数2」を省略したい場合、「引数3」が「引数2」と扱われないようにする。

makeSearchFrom(option, null, ids)

↑「引数3(ids)」を渡すために「引数2」をデフォルトで指定してある「null」で渡す。

名前付き引数を使う場合

makeSearchFrom(option, targetUserIds = ids)

「引数2」を省略して記述することが出来る。

文字通り「名前付き引数」なので指定した引数に正しく値が渡される。便利!

ただし、最初に書いたとおり「名前付き引数」の後に「通常の引数」は渡せないので注意。

おしまい