TLDR:我想用由旧的T
构造出来的新的T
替换在&mut 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实现是按值获取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" });
这是不可能的或者常见做法吗?