Rust中含String字段的结构体转换编译失败,求解决方案
问题原因
你遇到的编译错误核心原因有两个:
String和ObjectId(假设是MongoDB的ObjectId类型)都没有实现Copytrait,因此即使给User添加#[derive(Copy)]也无法通过编译——派生Copy要求结构体的所有字段都必须实现Copy,而堆分配的String显然不满足这一点。sanitize方法接收的是&self(对User的引用),直接赋值self._id、self.name等字段时,是试图将引用类型赋值给拥有所有权的类型,Rust的所有权系统不允许这种隐式转换。
简单解决办法
有两种常见的可行方案,根据你的使用场景选择:
方案1:克隆字段(保留原User的所有权)
利用User已经派生的Clone trait,对需要的字段进行克隆,生成新的拥有所有权的值:
impl User { pub fn sanitize(&self) -> SimplerUser { SimplerUser { _id: self._id.clone(), name: self.name.clone(), email: self.email.clone() } } }
这种方式不会消耗原User实例,调用sanitize后还能继续使用原来的User。
方案2:转移所有权(消耗原User)
如果调用sanitize后不再需要原User实例,可以将方法参数改为self(接收所有权),直接移动字段到SimplerUser中,避免克隆开销:
impl User { pub fn sanitize(self) -> SimplerUser { SimplerUser { _id: self._id, name: self.name, email: self.email } } }
内容的提问来源于stack exchange,提问作者Adrien Chapelet
相关产品推荐
相关产品推荐

