【发布时间】:2018-04-04 22:17:45
【问题描述】:
我正在使用 Rust 和 Rocket 构建一个 REST API。我有一个创建新用户的端点,定义如下:
/// View with which to create a user
#[post("/users", format = "application/json", data = "<user_data>")]
fn create_user(user_data: Json<UserData>, db: DB) -> Status<Json<Value>> {
let conn = db.conn();
let _new_user_result = user_data.into_new_user(&conn);
unimplemented!()
}
注意这里没有借用的内容; user_data 和 db 都是拥有的。不过,我在编译时收到以下错误:
error[E0507]: cannot move out of borrowed content
--> src/views/user_account.rs:75:28
|
75 | let _new_user_result = user_data.into_new_user(&conn);
| ^^^^^^^^^ cannot move out of borrowed content
供参考,into_new_user的函数签名为
fn into_new_user(self, conn: &SqliteConnection) -> Result<NewUser, Status<Json<Value>>> {
...
}
这里发生了什么?如果我真的借了任何东西,这个错误会更容易理解,但考虑到我拥有所有有问题的东西,我很困惑。
$ rustc --version; cargo --version
rustc 1.22.0-nightly (a47c9f870 2017-10-11)
cargo 0.23.0-nightly (e447ac7e9 2017-09-27)
【问题讨论】:
-
锈操场上的例子:play.rust-lang.org/…
-
把这个例子放在一起给出了答案:
user_data不是一个拥有的UserData对象。这是一个Json<UserData>对象,其中Json<T>取消引用T。碰巧Json<T>仅用于其构造函数,但编译器不知道这一点。现在我只需要弄清楚如何解决这个问题,我会把它写下来作为解决方案。
标签: rust rust-rocket