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
}
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としてマークできるパラメーターは1つだけです。 varargパラメーターがリストの最後のパラメーターでない場合は、名前付き引数構文を使用して、次のパラメーターの値を渡すことができます。
追記:経験したことから、通常、デフォルトの引数をリストの最後のパラメーターにするのがベストプラクティスです。 Pythonのように、これを強制する言語もあります(ただし、Pythonは、デフォルトの後に強制的な名前付き引数を許可します。これは、名前で呼び出すことができるためです。 dとにかく、デフォルトの引数の後にパラメータを設定することを回避します)。