2017-12-06 19 views
1

私は、an earlier questionで受け取ったアドバイスに基づいて、「エイリアス」で頻繁に使用される外国の機能(私が制御しない)の名前を短縮しました。これは拡張機能のためにうまく機能しました。しかし、私はいくつかのトップレベル関数を持っています。簡略化した例として、generateSequenceの機能を考えてみましょう。Genericsを含むKotlin関数のインラインエイリアス?

// DOES NOT COMPILE 
inline val <T:Any> seq:(()->T?)->Sequence<T> get() = ::generateSequence 

を...しかし、うまくin this answer説明したように、私は、ジェネリックは、受信機のタイプで使用されなければならないことができるので:私はこれを行うことができるようにしたいです。インラインを維持するトップレベル関数(ジェネリックを必要とする)の別名をエイリアスにする方法はありますか?

EDIT:私は質問を投稿した後Any?とスター投影権を使用してみましたが、私はまだそれは良い答えだとは思わない:

inline val seq:(()->Any?)->Sequence<*> get() = ::generateSequence 

それは型チェックを損なうので、これはboptimalsuようですシーケンスの要素型で、正しい?その他の答え/何がうまくいくかについての考え?それは単一のソースファイルに限られているものの

答えて

2

あなたが使用できるオプションは、名前変更のインポートです:

import kotlin.sequences.generateSequence as seq 

fun main(args: Array<String>) { 
    seq(1) { it + 1 }.take(10).forEach(::println) 
} 

とは別に、私が思うに、あなたができる最善のは、バック宣言に落ちています別のインライン関数:実際には

inline fun <T> seq(nextFunction:() -> T?) = 
    generateSequence(nextFunction) 

とき、関数の参照を返すインラインプロパティを使用すると、まだいくつかのオーバーヘッドを持っているので、私は、このオプションのパフォーマンスは、関数の参照と1のよりも良いことを期待したいですその参照を呼び出します。このcal lはインライン化されているため、別のネストされた呼び出しにオーバーヘッドが発生しません。

+0

私はあなたのインライン関数のアプローチが好きですが、私はそれが 'inline-parameter'エラーの'不正な使用を返します。私はインラインプロパティを使用しました。なぜなら、[この質問は早く](https://stackoverflow.com/questions/47605151)に依頼しても、インラインで別の方法を見つけることができなかったからです。インラインプロパティ(関数リファレンス)が 'noinline'ラムダパラメータを持つ関数よりも悪いと思いますか?(私ができること、つまりジェネリックを必要としない関数について話していると仮定した場合) – sirksel

関連する問題