Rust 返回 leveldb 数据库实例

问题描述

我想在 Rust 中使用 leveldb 数据库。如果我在一个函数中包含所有代码,一切正常,但我想拆分代码并使用不同的函数来创建条目和从数据库读取。我想到的最简单的方法,就是返回我在 create_database 中创建的数据库实例,然后将其作为参数提交给函数。问题是 Rust 不允许我使用 Database 作为类型。

这有效:

use std::{env,fs};
use leveldb::database::Database;
use leveldb::iterator::Iterable;
use leveldb::kv::KV;
use leveldb::options::{Options,WriteOptions,ReadOptions};


pub fn create_database() {
    let mut dir = env::current_dir().unwrap();
    dir.push("demo");

    let path_buf = dir.clone();
    fs::create_dir_all(dir).unwrap();

    let path = path_buf.as_path();
    let mut options = Options::new();
    options.create_if_missing = true;

    // Create Database
    let database = match Database::open(path,options) {
        Ok(db) => {db},Err(e) => {panic!("Failed to open database: {:?}",e)}
    };

    // Read from database
    let read_opts = ReadOptions::new();
    let res = database.get(read_opts,1);
    match res {
        Ok(data) => {
            assert!(data.is_some());
            assert_eq!(data,Some(vec![1]));
        }
        Err(e) => {panic!("Failed to read from database: {:?}",e)}
    };

    let read_opts = ReadOptions::new();
    let mut iter = database.iter(read_opts);
    let entry = iter.next();
    assert_eq!(
        entry,Some((1,vec![1]))
    );

    // Write to database
    let write_ops = WriteOptions::new();
    match database.put(write_ops,1,&[1]) {
        Ok(_) => {()},Err(e) => {panic!("Failed to write to database: {:?}",e)}
    };
}

但这不会:

use std::{env,ReadOptions};


pub fn create_database() -> Database {
    let mut dir = env::current_dir().unwrap();
    dir.push("demo");

    let path_buf = dir.clone();
    fs::create_dir_all(dir).unwrap();

    let path = path_buf.as_path();
    let mut options = Options::new();
    options.create_if_missing = true;

    // Create Database
    let database = match Database::open(path,e)}
    };
    return database;
}

pub fn get(database: Database) {
    // Read from database
    let read_opts = ReadOptions::new();
    let res = database.get(read_opts,vec![1]))
    );
}

pub fn put(database: Database) {
    // Write to database
    let write_ops = WriteOptions::new();
    match database.put(write_ops,e)}
    };
}

如果我执行这个程序,我会得到这个错误

error[E0107]: wrong number of type arguments: expected 1,found 0
 --> src/db/db.rs:8:29
  |
8 | pub fn create_database() -> Database {
  |                             ^^^^^^^^ expected 1 type argument

error[E0107]: wrong number of type arguments: expected 1,found 0
  --> src/db/db.rs:27:22
   |
27 | pub fn get(database: Database) {
   |                      ^^^^^^^^ expected 1 type argument

error[E0107]: wrong number of type arguments: expected 1,found 0
  --> src/db/db.rs:48:22
   |
48 | pub fn put(database: Database) {
   |                      ^^^^^^^^ expected 1 type argument

error: aborting due to 3 prevIoUs errors

For more @R_990_4045@ion about this error,try `rustc --explain E0107`.
error: Could not compile `gcoin`

To learn more,run the command again with --verbose.

我曾尝试寻找使用此数据库的示例,但没有找到任何匹配的内容。在源代码中,我发现 Database 有一个泛型类型,但找不到解决我的问题的方法

解决方法

解决了!谢谢Lockekmdreko