假设我有以下几点:
enum Item {
None,
Table(Table),
...
}
struct Table {
...
}假设我有这样的桌子:
let t = &mut Table::new();我将如何将t从&mut Table向上转换为&mut Item?如果我试图像这样直接转换:
let i = &mut Item::Table(t);我得到了错误mismatched types expected struct Table, found &mut Table。
发布于 2022-06-22 23:28:49
这是相当有问题的。
如果您不需要相同的地址,那么可以将其包装在Item::Table中。问题是,您需要拥有一个拥有的Table,但您只需要借用它。您可以从那里得到它,但是您需要在它的位置留下一些东西,这样引用仍然有效。您可以使用std::mem::take()将Default::default()放入内部,也可以使用std::mem::replace()放置其他内容。如果您只需要暂时使用replace_with机箱,也可以使用它。
let i = &mut Item::Table(std::mem::take(t));
let i = &mut Item::Table(std::mem::replace(t, Table::new()));
replace_with::replace_with_or_abort(t, |t| {
let mut i = Item::Table(t);
let i_ref = &mut i;
// Work with `i_ref`...
match i {
Item::Table(t) => t,
_ => unreachable!(),
}
}如果你确实需要它有相同的地址,那你就倒霉了。Item没有与Table相同的布局,所以您不能这样做。
https://stackoverflow.com/questions/72722847
复制相似问题