Rust 无法移出借用的内容,因为没有借用的内容

Rust 无法移出借用的内容,因为没有借用的内容,rust,rust-rocket,Rust,Rust Rocket,我正在使用Rust和Rocket构建RESTAPI。我有一个创建新用户的端点,定义如下: /// 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>>

我正在使用Rust和Rocket构建RESTAPI。我有一个创建新用户的端点,定义如下:

/// 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!()
}
作为参考,
进入新用户的函数签名为

fn into_new_user(self, conn: &SqliteConnection) -> Result<NewUser, Status<Json<Value>>> {
    ...
}

这里的问题在于
用户\u数据的类型。具体地说,正如函数签名中所写的那样,它的类型是
Json

Json
是一种包装类型,它告诉Rocket如何包装和展开Json值;这是一种方便的方法,它包装了您的结构,但不存储任何额外的数据。因此,它实现了
Deref
,这让您可以忽略它。然而,只有当你不尝试消费它时,这才有效

实现
Deref
的类型通常可以像使用
T
一样使用;编译器为您处理间接寻址。然而,在该函数调用中实际发生的事情更像是
::deref().into_new_user(),这就是问题发生的地方:
deref
被定义为
fn deref(&self)->&self::Target
。借债是隐式的、无形的,但它就在那里

在这种情况下,
Json
类型不再是必需的;它仅用于反序列化
UserData
struct。因此,我们可以通过丢弃它来解决这个问题。
Json::into_inner
方法丢弃
Json
包装器,为您提供一个拥有的
UserData
。然后可以按计划使用这些数据。综合起来,函数应该如下所示:

fn create_user(user_data: Json<UserData>, db: DB) -> Status<Json<Value>> {
    let conn = db.conn();
    let _new_user_result = user_data.into_inner().into_new_user(&conn);
    unimplemented!()
}
fn创建用户(用户数据:Json,db:db)->状态{
设conn=db.conn();
让_new_user_result=user_data.into_inner().into_new_user(&conn);
未执行!()
}

铁锈操场上的示例:将该示例放在一起可以得出答案:
user\u data
不是一个拥有的
UserData
对象。它是一个
Json
对象,其中
Json
解除对
T
的引用。碰巧
Json
仅用于其构造函数,但编译器不知道这一点。现在我只需要找出如何解决这个问题,我会把它写成一个解决方案。干得好。我本可以发现这一点,因为我已经在
Deref
上遇到了同样的问题。也许您应该在github上打开一个问题,询问一个更明确的错误消息:
在这里借用:user\u data.deref()
,例如是相关的。如果
DerefMove
成为一件事,那么当前错误的代码可以被更正。