2017-10-08 20 views
4

私は、.nameIsMuchTooLongAndIsStillNotClearのメソッドを含むKotlinネイティブライブラリオブジェクトを使用して、Kotlinで作業しています。 typealiasと同じように、メソッドのエイリアスを作成したいので、何かを.shortAndClearと呼ぶことができます。少し問題を複雑にするために、これらの関数にはいくつかのパラメータがあり、その多くはラッパーで前処理したくないデフォルトを持っています。さらなる研究の後、それはまだextension functionのように思えます。長いメソッド名のエイリアスとしてのKotlin拡張メソッド?

のは、私がString.begと呼ばれるString.startsWithのエイリアス型エクステンションを作成したいとしましょう、テストするのは簡単です例機能を使用します。

inline fun String.beg(prefix: CharSequence, ignoreCase: Boolean = false) = startsWith(prefix, ignoreCase) // works ok 

しかし、これは私がすべての引数とそのデフォルト値をリストすることを要求しているようだ、とすべての過負荷のためにそう:私は簡単に以下のソリューションが動作するように取得することができます。問題の実際のメソッドのシグネチャは、より多くのデフォルトを持つとかなり長くなります。「自分自身を繰り返さない」の精神で、function referenceString::startsWithを使用できる方法があります。これにより、すべての引数を列挙する必要はありません?私はいくつかの形式を試してみたが、それらのどれも動作しません:

// none of these work: 
fun String.beg = String::startsWith 
fun String.beg = this::startsWith 
val String.beg: (CharSequence, Boolean) -> Boolean = String::startsWith 

答えて

4

現在完全にあなたがやろうとしているものを達成する方法はありません。あなたは、デフォルトパラメータを保持したい場合、あなたは(あなたが言ったように)しなければならない。

fun String.beg(prefix: CharSequence, ignoreCase: Boolean = false) = startsWith(prefix, ignoreCase) 
// Or if you know that ignoreCase will be always false, you can pass the value directly to "startsWith() 
fun String.beg(prefix: CharSequence) = startsWith(prefix, false) 

を代わりに、あなたはパラメータをデフォルトたりしていない場合は、ときにデフォルト値を渡す必要があれば、あなたが気にしません関数を呼び出すと、関数参照を使用できます。この場合

val String.beg: (CharSequence, Boolean) -> Boolean get() = this::startsWith 
// If the parameters can be inferred, you can avoid the type specification. 
// In this case it won't compile because there are several combinations for "startsWith()". 
val String.beg get() = this::startsWith 

begはラムダですので、あなたは、パラメータのデフォルト値を指定することはできません。

Kotlin 1.2(現在ベータ版)以降、機能参照にthisを指定することを避けることができます。上に書かれた同じ例がKotlin 1.2:

val String.beg: (CharSequence, Boolean) -> Boolean get() = ::startsWith 
// If the parameters can be inferred, you can avoid the type specification. 
// In this case it won't compile because there are several combinations for "startsWith()". 
val String.beg get() = ::startsWith