我发现自己在玩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。