即使对Rust进行了几个月的试验,我对Rust的工作原理还是很陌生的。我正在使用R2D2(0.8.0)和Rocket(0.4.4)+ Rocket_cors(0.5.2)]写一个Web服务器
Rocket允许您将其结构馈入状态池,因此我不必每次有人发送请求时都初始化我的Postgres服务器。这是代码:
struct ConnectionPool<M: r2d2::ManageConnection> { val: r2d2::Pool<M> } #[post("/upload", format = "application/json", data = "<data>")] fn upload(data: Data, state: rocket::State<ConnectionPool>) { if data.peek_complete() { println!("All of the data: {:?}", str::from_utf8(data.peek()).unwrap()); } //data.stream_to_file(env::temp_dir().join("upload.txt")) // .map(|n| n.to_string()) // .map_err(Debug) }
显然,这只是代码的一部分,但是r2d2 :: ConnectionPool需要一个类型标识符:如果我忽略了此要求,就会给我这个错误(在上面的代码片断的第4行):
wrong number of type arguments: expected 1, found 0 expected 1 type argumentrustc(E0107) main.rs(45, 44): expected 1 type argument
但是当我尝试通过更新代码来解决问题时:
fn upload(data: Data, state: rocket::State<ConnectionPool>) { | v fn upload(data: Data, state: rocket::State<ConnectionPool<r2d2::ManageConnection>>) {
我收到此错误:
the size for values of type `(dyn r2d2::ManageConnection + 'static)` cannot be known at compilation time
doesn't have a size known at compile-time
help: the trait `std::marker::Sized` is not implemented for `(dyn r2d2::ManageConnection + 'static)`
即使对Rust进行了几个月的试验,我对Rust的工作原理还是很陌生的。我正在使用R2D2(0.8.0)和Rocket(0.4.4)+ Rocket_cors(0.5.2)写一个Web服务器,Rocket允许...
r2d2::ManageConnection
是特征。无需重复特征名称,您需要将其传递给实现该特征的具体类型。