名前付き引数で常に呼びたいいくつかのコンストラクタと関数があります。これを必要とする方法はありますか?名前付き引数を使用するコンストラクタ/関数の呼び出しを強制するにはどうすればよいですか?
私はKotlinでこれを行う方法を発見した
名前付き引数で常に呼びたいいくつかのコンストラクタと関数があります。これを必要とする方法はありますか?名前付き引数を使用するコンストラクタ/関数の呼び出しを強制するにはどうすればよいですか?
私はKotlinでこれを行う方法を発見した
など、多くのパラメータを持つコンストラクタと機能のために、名前付き引数を使用した場合に、より明確に読むもののためにこれを行うことができるようにしたいのですがSTDLIBからNothing
を使用して、1.0:Array<Nothing>
として
/* requires passing all arguments by name */
fun f0(vararg nothings: Nothing, arg0: Int, arg1: Int, arg2: Int) {}
f0(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments
//f0(0, 1, 2) // doesn't compile without each required named argument
/* requires passing some arguments by name */
fun f1(arg0: Int, vararg nothings: Nothing, arg1: Int, arg2: Int) {}
f1(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments
f1(0, arg1 = 1, arg2 = 2) // compiles without optional named argument
//f1(0, 1, arg2 = 2) // doesn't compile without each required named argument
はvararg nothings: Nothing
の値が(私は仮定反射の短い)に渡されるために作成することができない、Kotlinで違法です。これはちょっとハックしているようですが、空の配列Nothing
のバイトコードにオーバーヘッドがあると思われますが、うまくいくようです。
このアプローチは、vararg
を使用できないデータクラスプライマリコンストラクタでは機能しませんが、private
とマークでき、セカンダリコンストラクタはvararg nothings: Nothing
として使用できます。
しかし、このアプローチはKotlin 1.1では使用できません: "禁止された可変パラメータ型:なし"。 :
ありがたいことに、希望はKotlin 1.1で失われていません。プライベートコンストラクタ(Nothing
など)で独自の空のクラスを定義し、それを最初のvarargsパラメータとして使用してこのパターンを複製できます。
これは決して言語の設計によって意図されていませんでしたがあなたの工夫に拍手を送ってください:) –
* arrayOf
@Deanveloper私はそれを試してみました。私は "Unsuppored [戻り値の型で配列
関連するKotlinのバグ:https://youtrack.jetbrains.com/issue/KT-14934 –