问题描述
我想在 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 有一个泛型类型,但找不到解决我的问题的方法。