0

setRust LMDB ライブラリ( docs ) を呼び出す関数と、私が取り組んでいる例を作成しようとしています。

私は一生これを機能させることはできません。これが私の現在の試みです:

fn main() {
    let env = getenv("duperdb");
    let dbhandle = get_dbhandle("", &env);
    let txn = new_transaction(&env);
    let vec = vec![("foo", "another text"), ("bar", "and another")];
    set(&dbhandle, &env, &vec);

    let reader = env.get_reader().unwrap();
    let db = reader.bind(&dbhandle);
    let note = db.get::<&str>("foo").unwrap();

    println!("NOTE: {}", note);
}

は次setのように定義されます。

pub fn set<A: ToMdbValue, B: ToMdbValue>(
    handle: &DbHandle,
    env: &Environment,
    pairs: &Vec<(&A, &B)>) -> () {

    let txn = new_transaction(&env);

    {
        let db = txn.bind(&handle);

        for &(id, note) in pairs.iter() {
            db.set(&id, &note).unwrap();
        }
    }

    match txn.commit() {
            Err(_) => panic!("Failed to commit!"),
            Ok(_) => (),
    }
}

これにより、次のエラーが吐き出されます。

src/db/wrapper.rs:28:20: 28:23 error: the trait `lmdb::traits::ToMdbValue` is not implemented for the type `&A` [E0277]
src/db/wrapper.rs:28             db.set(&id, &note).unwrap();
                                        ^~~

も試しdb.set(id, note).unwrap();ましたが、今回は次のようになります。

src/main.rs:13:5: 13:8 error: the trait `core::marker::Sized` is not implemented for the type `str` [E0277]
src/main.rs:13     set(&dbhandle, &env, &vec);
                   ^~~
src/main.rs:13:5: 13:8 help: run `rustc --explain E0277` to see a detailed explanation
src/main.rs:13:5: 13:8 note: `str` does not have a constant size known at compile-time
src/main.rs:13:5: 13:8 note: required by `dupernote::db::wrapper::set`
src/main.rs:13:5: 13:8 error: the trait `lmdb_rs::traits::ToMdbValue` is not implemented for the type `str` [E0277]
src/main.rs:13     set(&dbhandle, &env, &vec);
                   ^~~

私も次のようなものを試しました:

    for (id, note) in pairs.iter() {
        db.set(id, note).unwrap();
    }

しかし、それもうまくいきません...理由は完全にはわかりません。タイプがidありませんか?note&strstr

4

3 に答える 3

1

私はそれを機能させることができました。この解決策がどれほどコーシャであるかはわかりませんが、投稿します.

ではmain()、次のようにします ( (int, string)kv ペアの例)。

let k = 1;
let val = "hello there";
let vec = vec![(&k, &val)];
set(&dbhandle, &env, &vec);

vec![(&1, &"hello there")]フォームのエラーをスローしたため、それらを個別に宣言する必要がありましたborrowed value does not live long enough

set次のようになります。

pub fn set<A, B>(handle: &DbHandle, env: &Environment, pairs: &Vec<(&A, &B)>)
    -> ()
    where A: ToMdbValue,
          B: ToMdbValue {

    let txn = new_transaction(&env);

    {
        let db = txn.bind(&handle);

        for &(id, note) in pairs.iter() {
            db.set(id, note).unwrap();
        }
    }

    match txn.commit() {
            Err(_) => panic!("Failed to commit!"),
            Ok(_) => (),
    }
}
于 2016-03-15T20:05:14.440 に答える
1

エラーが発生する関数の定義 (ドキュメントを正しく読んでいる場合):

fn set(&self, key: &ToMdbValue, value: &ToMdbValue) -> MdbResult<()>

key特性オブジェクトへの参照でなければなりません。実装しているジェネリック型への参照を渡そうとしていますToMdbValue

https://doc.rust-lang.org/book/trait-objects.html

確認できませんが、これは機能するはずです:

pub fn set(handle: &DbHandle, env: &Environment, pairs: &Vec<(&ToMdbValue, &ToMdbValue)>) -> () {

    let txn = new_transaction(&env);

    {
        let db = txn.bind(&handle);

        for &(id, note) in pairs.iter() {
            db.set(id, note).unwrap();
        }
    }

    match txn.commit() {
            Err(_) => panic!("Failed to commit!"),
            Ok(_) => (),
    }
}

その他: boxed trait objects で作業したいかもしれませんBox<ToMdbValue>。上記のリンクはそれを説明しています。&[YourType]ではなくa を渡す必要があり&Vec<[YourType]>ます。

于 2016-03-15T17:01:05.867 に答える