症状
编译器报 E0382,使用了已移动的值,并同时指出移动处与之后的使用处。Rust 默认移动非 Copy 值,因此把 String 传给取得所有权的函数会终止调用方的访问。该错误很精确,通常意味着设计需要一个借用、一次克隆,或调整使用顺序。
诊断
读取移动位置;不需要所有权时改为借用;确需两个所有者时克隆;或把移动放到最后一次使用之后。
cargo build 2>&1 | head -30
根因
值被移动给新所有者后又在原位置被使用,而在那里它已不存在,因为 Rust 默认移动而非复制非 Copy 类型。
修复
不需要所有权时以借用替代移动;两处都需所有权时克隆;或调整顺序,使移动发生在最后一次使用之后。到处用 Clone 能通过,但会增加开销与分配,仅读取时应优先借用。
验证
重新构建确认错误消失,再跑测试确认值被正确处理。测试通过且数据符合预期才算所有权决策正确,而不仅是可编译。
常见陷阱
为省事大量 clone 会在热路径引入分配开销;应辨别是否真的需要两份所有权。