【发布时间】:2023-04-01 21:45:01
【问题描述】:
TLDR:我想将 &mut T 后面的 T 替换为从旧 T 构造的新 T
注意:如果这个问题的解决方案很容易找到,请原谅我。我做了很多谷歌搜索,但我不确定如何正确表达这个问题。
示例代码 (playground):
struct T { s: String }
fn main() {
let ref mut t = T { s: "hello".to_string() };
*t = T {
s: t.s + " world"
}
}
这显然失败了,因为 String 上的 add impl 采用 self 的值,因此需要能够移出 T,但这是不可能的,因为 T 在引用后面。
据我所知,实现这一目标的通常方法是做类似的事情
let old_t = std::mem::replace(t, T { s: Default::default() });
t.s = old_t + " world";
但这要求创建一些占位符 T 是可能且可行的,直到我们可以用真实数据填充它。
幸运的是,在我的用例中,我可以创建一个占位符 T,但我仍然不清楚为什么无法使用类似的 api:
map_in_place(t, |old_t: T| T { s: old_t.s + " world" });
是否有不可能或通常无法做到的原因?
【问题讨论】:
标签: rust