web-dev-qa-db-ja.com

Rust関数から可変量の出力を提供する最も一般的な方法は何ですか?

私は現在、機械学習アルゴリズムのAPIをRustで作成しています。単一の遺伝的アルゴリズム、人工ニューラルネットワーク、またはベイジアンネットワークで複数の出力を提供して、冗長性があるので、アルゴリズムはお互いに利益を得ることができます。私はこれらを使用して多くの出力を生成するつもりなので、出力の量は簡単ではありません。

ベクター

C++では、複数の変数出力を返したい場合、それらを関数に参照渡しされたベクトルに追加する可能性がありますが、ユーザーが値をベクトルに配置することを想定しているため、非常に制限されています。後でそれらを他のデータ構造に移動する必要がある場合は、結果の出力をコピーするためにオーバーヘッドが発生します。

特徴

私はRustを使用しており、特性システムには、いくつかの標準データ構造に実装できる多くの特性がたくさんあるので、イテレータのように機能する特性があるかどうか疑問に思っています。 Rustの単形化を使用してオーバーヘッドを回避しながら、一般的な方法で任意の構造に値を追加するために呼び出すことができます。

閉鎖

または、FnMutパラメーターを作成してクロージャーを渡すことも検討しています。このパラメーターを渡すと、必要に応じてこれらの値を使用できます。値をデータ構造に配置する必要がまったくない場合は、値を直接使用できるため、この方法も強力です。欠点は、このメソッドを使用するたびに関数呼び出しのオーバーヘッドが発生することを想定していますが、確かではありません。

イテレータ

私が検討しているもう1つの方法は、Rustイテレータを使用することです。各出力をそれぞれとして生成するために必要なアルゴリズムの部分を遅延処理する機械学習アルゴリズムからイテレータを返すことができるはずです。値が要求され、next()が呼び出されたときにイテレータから出力されます。このメソッドは、最高の柔軟性と最高のパフォーマンスを提供するはずですが、これはRustイテレータ、ただし標準ライブラリに similar things が表示されます。イテレータ構造の内部の計算ですべての中間状態を格納できるように、イテレータを実装することは可能だと思いますただし、イテレータがスコープ内にある限り、学習アルゴリズム構造体からの借用で問題が発生する可能性がありますが、これは問題ではないと思います。

これらの方法のどれがジェネリックプログラミングに最も有用であり、Rustのベストプラクティスに適合しますか?パフォーマンスが向上したり、ジェネリックプログラミングのサポートが向上したりする、検討していない他のメソッドはありますか?また、これらの方法を改善する方法についての批判やアドバイスは喜んで歓迎され、受け入れられます。

5
vadix

あなたが提案するイテレータの使用がイテレータの乱用であるとはまったく思いません。イテレータが計算を実行し、かなりの量の状態を持つことは完全に許容されます。 Rustには、イテレータを処理および作成するための組み込みツールが多数あるため、これはおそらくユーザーにとって最も簡単な方法です。

3
Paul Stansifer