0

他の構造体 (私が定義していない) への参照を含むフィールドを持つ構造体があります。

struct HtmlHandlebars {
    user_helpers: Vec<(String, Box<HelperDef + 'static>)>,
}

そしてHtmlHandlebars、機能を実装する必要があります

fn render(&self, ...) -> &self

そして、その関数では、Boxを別の関数に移動する必要があります。このようなもの:

fn render(&self, ...) -> &self {
    let mut handlebars = Handlebars::new();
    for (name, helper) in self.user_helpers {
        handlebars.register_helper(&name, helper);
    }
}

しかし、私はちょっと立ち往生しています:

  • 借用しているため、Box 参照を移動できませんself
  • その構造体はコピーを実装していないため、ボックス参照をコピーできません
  • 他の問題を引き起こすため、&self変更できません...&mut self

多分私はそれを完全に間違っています..他にできることはありますか?私のオプションは何ですか?

コードのより完全な概要が必要な場合は、ここで見つけることができます

PS:タイトルで状況を説明する方法がわかりませんでした。自由に変更してください。

4

1 に答える 1

0

あなたが書いたコードは、Vecとその要素を消費しようとしています。&self.user_helpers一般に、要素を消費するのではなく、要素への参照を提供するものを反復処理できます。つまり、(パターンのモジュロ愚かなタイプミス):

for &(ref name, ref helper) in self.user_helpers {
    handlebars.register_helper(name, helper);
}

参照: The Rust Programming Language on iterating vectors .

ただし、これには問題があります。Handlebars にはヘルパーの所有権が必要です。Handlebarsレンダリングするたびに新しいオブジェクトを作成する必要がある可能性は非常に高いですが、その場合、新しい を作成するたびにすべてのヘルパーも作成できる必要がありますHandlebars。少なくとも への&mut参照を取得せずに、ボックスの所有権を取得する方法はありませんVec。構造体からハンドラーを取り出すには、少なくとも変更可能なアクセスが必要です。そして、それを行った場合、次に呼び出されたときにハンドラーが手元にありませんrender()。一連のハンドラーがどの程度構成可能であるかに応じて、Vec<Box<HelperDef + 'static>>必要なときに何もないところから構築する関数を作成したり、構築Box<HelperDef + 'static>するコールバックのリストを維持したりできます。

于 2015-08-16T19:49:53.493 に答える