複数のロジックブランチをサポートするイテレータを作成するための最良の方法は何ですか?

アイデアマン42

Rustでは、コールバック関数を使用するコードからイテレーターを変換して、イテレーターの作成を開始しました。

関数の複数のブランチでコールバックを使用するコードが、Rustイテレーターにそれほどきれいに変換されないという問題に遭遇しました。

いくつかの擬似コードを与えるため。

// function using callbacks where the caller can exit at any time,
// can be used in a similar way to an iterator.
fn do_stuff(args, callback_fn(cb_args)) {
    // define a, b, c... args
    if callback_fn(a, b, 0) == false { return; }
    for i in 0..n {
        if callback_fn(c, d, i) == false { return; }
    }
    if callback_fn(e, f, -1) == false { return; }
}

これをイテレータに変換するのは、各ブランチを表す状態を格納する必要があるため、かなり厄介でした。

impl Iterator for MyStruct {
    fn next(&mut self) -> Option<MyResult> {
        let out = match (self.state) {
            0 => {
                self.state += 1;
                Some(MyResult(self.a, self.b, 0))
            },
            1 => {
                self.i += 1;
                if self.i == self.n {
                    self.state += 1;
                }
                Some(MyResult(self.c, self.d, self.i - 1))
            },
            2 => {
                self.state += 1;
                Some(MyResult(self.e, self.f, -1))
            },
            _ => {
                None
            },
        }
        return out;
    }
// --- snip

上記の例では、これはほぼ間違いなく受け入れられます(少し厄介な場合)。状態を追跡するのがはるかに難しい、複数のforループ、可変スコープの場合を考えてみます。


私はこれらを試しませんでしたが、これを達成するためのいくつかの方法があると思います。ほとんどの場合、それはあまり理想的ではない回避策です。

  • コールバックバージョンを使用して、ベクターを作成し、それを反復処理します...
    (機能しますが、イテレーターを使用する目的を無効にします。たとえば、早期終了してデータセット全体の作成を回避する方法はありません)。
  • コールバックバージョンと同様のロジックを使用するスレッドと通信するイテレータを作成します。
    (可能ではありますが、OSスレッドを作成するオーバーヘッドにより、多くの場合、適切な選択にはなりません)。

上記の回避策に加えて:

与えられた例のように、それほど複雑でないロジックでイテレータを書く方法はありますか?
理想的には、コールバックを使用する例に似ています。
そうでなければ、これを処理する他の方法はありますか?

それとも、これは単にRustではサポートされていませんか?


Pythonジェネレーターからの同じロジックが適用されることに注意してください(コールバックの代わりにyieldを使用し、コールバックはファーストクラス関数に遍在しているため、ここでは例としてコールバックを使用します)。

フランシス・ガニェ

C#やPythonなどの言語は、特別なyieldキーワードを使用して記述されたメソッドからイテレーターを生成する方法を提供しますRust 1.11の時点では、この言語にはそのような機能はありません。ただし、このような機能は計画されており(RFCを参照)(実際、yield予約済みのキーワードです!)、C#と同様に機能する可能性があります(つまり、コンパイラーはに必要な状態と実装を備えた構造体を生成しますIterator)。

それまでの間、この機能を提供しようとするプロジェクトであるステートフルを試すことができます。このブログ投稿では、ステートフルの仕組みとそれに伴う課題について説明しています。)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネイティブのAndroidコンポーネントを使用してAndroidのレベルセレクターとなる2Dマップを作成するための最良のアプローチは何ですか?

分類Dev

ステートフルマイクロサービスを作成するための最良のアプローチ(プラクティス)は何ですか?

分類Dev

リソースコントローラー内で複数のサービスを使用するための最良のアプローチは何ですか?

分類Dev

SQLの複数のテーブルを作成するための最良の方法は何ですか?

分類Dev

複数のターゲットフレームワークを同時にサポートする.NETライブラリを作成するための信頼できる(標準化された)アプローチはありますか?

分類Dev

pytestのテストで複数のブール値の組み合わせをサポートするための最良の方法は何でしょうか?

分類Dev

私のウェブサイトでベンチマークとエラーを記録するための最良の方法は何ですか?

分類Dev

オンラインのAzure関数をローカルのgitリポジトリに移動するための最良の方法は何ですか?

分類Dev

複数のアクティビティでスライダーを左に移動するための最良のアプローチは何ですか

分類Dev

Javaで図やチャートを作成するための最良のライブラリは何ですか?

分類Dev

アクティブなインターフェイスコントローラーとは関係なく、Apple Watchにメッセージを表示するための最良の方法は何ですか?

分類Dev

APIからのデータで複雑なオブジェクトを作成するための最良の方法は何ですか?

分類Dev

クライアントに何もインストールせずにレポートを表示するための最良の方法は何ですか

分類Dev

MVCコントローラーで一度に複数のレコードを編集するための最良の方法は何ですか

分類Dev

Typescript、異なるタイプのネストされたオブジェクトを宣言するための最良のアプローチは何ですか?

分類Dev

NativeScriptAngularで複数ページのフォームを作成するための最良の方法は何ですか

分類Dev

クライアント側(angularjs)にデータを保存するための最良の方法は何ですか?

分類Dev

オブジェクトである元の列のdtypeに基づいて、データフレームに複数のダミー変数を作成するための最良の方法は何ですか?

分類Dev

単一のgithubリポジトリからAWSに複数のラムダ関数をデプロイするための最良の方法は何ですか?

分類Dev

クライアントの登録情報をハイパーレジャーファブリックにオフチェーンで保存するための最良の方法は何ですか

分類Dev

複数のdjangoテンプレートファイルで同じhtmlブロックを表示するための最良のDRY方法

分類Dev

バックエンドサーバーがGoogleドライブAPIを使用することを承認するための最良の方法は何ですか?

分類Dev

Android:リポジトリパターンオブジェクトを作成するための最良の解決策は何ですか?

分類Dev

カスタムポップアップインタースティシャル広告を作成するための最良の方法は何ですか?

分類Dev

ifステートメントで複数の文字列をチェックするための最良の方法

分類Dev

JPAサマリーオブジェクトを取得するための最良の方法は何ですか?

分類Dev

センサー出力データを格納するためにAzureテーブルストレージにパーティションキーを作成する最良の方法は何ですか?

分類Dev

40,000ページを超えるWebサイトのHTMLサイトマップを作成するための最良の方法は何ですか?

分類Dev

複数のデバイスサイズをターゲットにする最良の方法は何ですか?

Related 関連記事

  1. 1

    ネイティブのAndroidコンポーネントを使用してAndroidのレベルセレクターとなる2Dマップを作成するための最良のアプローチは何ですか?

  2. 2

    ステートフルマイクロサービスを作成するための最良のアプローチ(プラクティス)は何ですか?

  3. 3

    リソースコントローラー内で複数のサービスを使用するための最良のアプローチは何ですか?

  4. 4

    SQLの複数のテーブルを作成するための最良の方法は何ですか?

  5. 5

    複数のターゲットフレームワークを同時にサポートする.NETライブラリを作成するための信頼できる(標準化された)アプローチはありますか?

  6. 6

    pytestのテストで複数のブール値の組み合わせをサポートするための最良の方法は何でしょうか?

  7. 7

    私のウェブサイトでベンチマークとエラーを記録するための最良の方法は何ですか?

  8. 8

    オンラインのAzure関数をローカルのgitリポジトリに移動するための最良の方法は何ですか?

  9. 9

    複数のアクティビティでスライダーを左に移動するための最良のアプローチは何ですか

  10. 10

    Javaで図やチャートを作成するための最良のライブラリは何ですか?

  11. 11

    アクティブなインターフェイスコントローラーとは関係なく、Apple Watchにメッセージを表示するための最良の方法は何ですか?

  12. 12

    APIからのデータで複雑なオブジェクトを作成するための最良の方法は何ですか?

  13. 13

    クライアントに何もインストールせずにレポートを表示するための最良の方法は何ですか

  14. 14

    MVCコントローラーで一度に複数のレコードを編集するための最良の方法は何ですか

  15. 15

    Typescript、異なるタイプのネストされたオブジェクトを宣言するための最良のアプローチは何ですか?

  16. 16

    NativeScriptAngularで複数ページのフォームを作成するための最良の方法は何ですか

  17. 17

    クライアント側(angularjs)にデータを保存するための最良の方法は何ですか?

  18. 18

    オブジェクトである元の列のdtypeに基づいて、データフレームに複数のダミー変数を作成するための最良の方法は何ですか?

  19. 19

    単一のgithubリポジトリからAWSに複数のラムダ関数をデプロイするための最良の方法は何ですか?

  20. 20

    クライアントの登録情報をハイパーレジャーファブリックにオフチェーンで保存するための最良の方法は何ですか

  21. 21

    複数のdjangoテンプレートファイルで同じhtmlブロックを表示するための最良のDRY方法

  22. 22

    バックエンドサーバーがGoogleドライブAPIを使用することを承認するための最良の方法は何ですか?

  23. 23

    Android:リポジトリパターンオブジェクトを作成するための最良の解決策は何ですか?

  24. 24

    カスタムポップアップインタースティシャル広告を作成するための最良の方法は何ですか?

  25. 25

    ifステートメントで複数の文字列をチェックするための最良の方法

  26. 26

    JPAサマリーオブジェクトを取得するための最良の方法は何ですか?

  27. 27

    センサー出力データを格納するためにAzureテーブルストレージにパーティションキーを作成する最良の方法は何ですか?

  28. 28

    40,000ページを超えるWebサイトのHTMLサイトマップを作成するための最良の方法は何ですか?

  29. 29

    複数のデバイスサイズをターゲットにする最良の方法は何ですか?

ホットタグ

アーカイブ