0

我发现自己在玩warp

我想使用static dispatch将数据库 Trait 传递给warp::Filter,这样具体的数据库可能会有所不同。

我读到 Send + Sync实施起来不安全,但我不完全理解何时实施它们是合适的。

在这种情况下实现 Send + Sync 是否合理:

use std::sync::{Arc, RwLock};

use warp::Filter;
use warp::reply::{json};
use serde_json::{Value};


pub trait IDatabase {
    fn db_read(&self) -> Value;
    fn db_write(&self, data: Value);
}

pub fn get_api_v0_test<T: IDatabase + Send + Sync>(
    db: Arc<RwLock<T>>
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {
    warp::path!("api" / "v0" / "test")
        .and(warp::get())
        .map(move || {
            json(&db.read().unwrap().db_read())
        })
}

编辑:

是的,这个例子是完全合理的!

正如@trentcl 和@Masklinn 所指出的,我实际上并没有实现Send + Sync,我只是要求传递给过滤器的任何类型T,实现Send + Sync Traits,这是完全安全的Rust。

4

1 回答 1

0

我读到Send + Syncunsafe实施,但我不完全理解何时实施它们是合适的。

因为SendSync自动派生的,所以只有在包装原始指针时才适合显式派生它们,通常是因为您正在包装本机库,并且在确保特征适合基础类型之后。

在这种情况下实现 Send + Sync 是否合理:

我不明白你想在这种情况下“实现发送+同步”。

pub trait IDatabase {

Rust 不是 C#,IWhatever不是东西。

于 2021-10-01T11:58:26.617 回答