私のプログラムはrusqliteを使用して、別のデータソースからデータベースを構築します。データベースは、同じように複数のテーブルを作成しますので、私は私がそうするように、再利用可能な機能を作るだろうと思って:コンパイル済みSQL文の問題を借用
fn download_generic<Inserter>(table_name: &str,
connection: &mut rusqlite::Connection,
inserter: &mut Inserter)
-> Result<(), String>
where Inserter: FnMut(&str, &json::JsonValue) ->()
{}
inserter
は、以前に準備されたステートメントから正しい値を結合し、挿入を行う機能であります。
私はこのようにそれを呼び出す:それはすでにinsert_stmt
で借りされていますので、私はdownload_generic
に&mut connection
を渡すことはできませんしかし
let mut insert_stmt = connection
.prepare("insert or replace into categories values(?,?);")
.unwrap();
download_generic("categories",
&mut connection,
&mut |uuid, jsonproperties| {
insert_stmt.execute(&[&uuid, &jsonproperties["name"].as_str().unwrap_or("")]);
});
。 RefCell
に入れても意味がありません。なぜなら、この作業を行うためにランタイムオーバーヘッドは必要ないはずですからです。
download_generic
に渡すラムダによって生成されたinsert_stmt
を作成しようとする可能性がありますが、生涯のマーカーをどこにでも追加する必要があり、不自然なように見えます。
'RefCell'に入れても動作しません。' RefCell'はコンパイル時ではなく実行時にチェックしますが、同じ根底にあるチェックは=> **エイリアスXOR Mutability **を実行します。明らかな問題は、同じ接続を(不変的に)借りることはできませんか? 1つの必要な借用が変更可能な場合、あなたは運がありません。 –
'download_generic'がそれを保持するように、insert_stmtを何とかラムダに移動することはできませんか? – njaard
代わりに 'prepare'の代わりに' prepare_cached'を使用して、クロージャ内で準備されたステートメントを取得できますか?競合する借用を避けるために、クロージャに 'connection'を明示的に渡す必要があります。 –