Kotlinでコードを書いている時に
「Mixing named and positioned arguments is not allowed」
というエラーで怒られてしまったのでメモ
動作環境
Kotlin: 1.2.50
問題の Kotlin のコード
こんな関数があるとする。
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パターン1
makeMoge(option, groupId = id, targetUserIds = ids)
「名前付き引数」の後に、「名前付き引数」を渡せば正しく呼び出せる
OKパターン2
makeMoge(option, id, ids)
「名前付き引数」を使わず、「通常の引数」を順番通り正しくセットしても呼び出せる。
OKパターン3
makeMoge(option, targetUserIds = ids, groupId = id)
ちなみに、「名前付き引数」なので「関数の定義順番通り」でなくても呼び出せる。
Kotlin の名前付き引数と引数の使い方
おまけで名前付き引数と引数の使い方をおさらい。
この関数で受け取る引数は合計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」を省略して記述することが出来る。
文字通り「名前付き引数」なので指定した引数に正しく値が渡される。便利!
ただし、最初に書いたとおり「名前付き引数」の後に「通常の引数」は渡せないので注意。
おしまい
コメント