web-dev-qa-db-ja.com

Kotlin:最初の引数のデフォルト値を使用して関数呼び出しを行い、2番目の引数に値を渡す方法は?

2番目の引数の値を指定するときに、デフォルトの引数を使用して関数を呼び出す方法を知りたいのですが。以下の簡単な例では、addTwo()が2つの引数を取ることを示しています。 'first'引数にはデフォルト値がありますが、 'secondにはありません。 「first」にデフォルト値を使用し、「second」に指定された値2を使用するように指定して、この関数を呼び出すにはどうすればよいですか?

AddTwo(2)を呼び出すと、エラーがスローされます。

fun main(args: Array<String>) {
    var sum = addTwo(1,2)    // works fine
    var nextSum = addTwo(2)  // ERROR: No value passed for parameter second 
}

fun addTwo(first: Int = 0, second: Int): Int {
    return first + second
}
10
hlupico

Kotlinは、2番目のパラメーターを省略した理由がわからないため、これはエラーです。 firstはデフォルトにすることができますが、secondはできません。したがって、1つの引数のみを渡した場合、それはパラメーターfirst用でした。エラーメッセージは、問題が何であるかを正確に示しています。

パラメータに値が渡されませんsecond

空白のままにしておきたい最初のデフォルトパラメータの後は、 名前付き引数 を使用して呼び出す必要があります。あなたの場合、これは次のようになります。

addTwo(second = 2) // first defaulted to 0

デフォルトのパラメータが別の順序であった場合、呼び出しは問題ありません。

fun addTwo(first: Int, second: Int = 0): Int{
    return first + second
}

addTow(2)  // no error, second defaulted to 0

2つのパラメーターのデータ型が異なる場合、2番目のパラメーター(次の例ではInt)のタイプではなく、最初のパラメーター(Date)のタイプが予期されていることを通知する別のあまり明確でないエラーが表示されます。

fun something(first: Int = 0, second: Date): Date { ... }

something(Date()) // ERROR: Type mismatch: inferred type is Java.util.Date but kotlin.Int was expected

注:varargで同じ問題が発生する可能性があります :

Varargとしてマークできるパラメーターは1つだけです。 varargパラメーターがリストの最後のパラメーターでない場合は、名前付き引数構文を使用して、次のパラメーターの値を渡すことができます。

29
Jayson Minard

追記:経験したことから、通常、デフォルトの引数をリストの最後のパラメーターにするのがベストプラクティスです。 Pythonのように、これを強制する言語もあります(ただし、Pythonは、デフォルトの後に強制的な名前付き引数を許可します。これは、名前で呼び出すことができるためです。 dとにかく、デフォルトの引数の後にパラメータを設定することを回避します)。

1
Jacob Zimmerman