簡體   English   中英

Rust 返回 leveldb 數據庫實例

[英]Rust return leveldb Database instance

我想使用Rust中的leveldb數據庫。 如果我將所有代碼都放在一個 function 中,那么一切正常,但是我想將代碼拆分並具有不同的功能來創建條目和從數據庫中讀取。 我想到的最簡單的方法是返回我在create_database中創建的數據庫實例,然后將其作為參數提交給function。 問題是 Rust 不允許我使用數據庫作為類型。

這有效:

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, fs};
use leveldb::database::Database;
use leveldb::iterator::Iterable;
use leveldb::kv::KV;
use leveldb::options::{Options, WriteOptions, 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, options) {
        Ok(db) => {db},
        Err(e) => {panic!("Failed to open database: {:?}", e)}
    };
    return database;
}

pub fn get(database: Database) {
    // 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]))
    );
}

pub fn put(database: Database) {
    // 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)}
    };
}

如果我執行這個程序,我會得到這個錯誤:

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 information about this error, try `rustc --explain E0107`.
error: could not compile `gcoin`

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

我曾嘗試尋找使用此數據庫的示例,但沒有找到任何匹配的內容。 在源代碼中,我發現 Database 具有泛型類型,但找不到解決問題的方法。

解決了! 感謝Lockekmdreko

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM