我希望能够获取到在Foo
枚举中被包裹在Bar
中的usize
的引用(不可变和可变都可以):
use Foo::*;
#[derive(Debug, PartialEq, Clone)]
pub enum Foo {
Bar(usize)
}
impl Foo {
/* this works */
fn get_bar_ref(&self) -> &usize {
match *self {
Bar(ref n) => &n
}
}
/* this doesn't */
fn get_bar_ref_mut(&mut self) -> &mut usize {
match *self {
Bar(ref mut n) => &mut n
}
}
}
但我无法获得可变引用,因为:
我可以提供访问
n
的生存期不够长
Foo
中其他被 Box
包装的内容的类似功能的两个变体 - 为什么对于一个未包装的原始类型,可变借用会失败(为什么只有它)?
get_bar_ref
的行为不同呢? - Peter Hall&Bar(ref n) => &n
应该扩展为&Bar(ref n) => &*(n.deref())
,但它无法编译。我想这里涉及到一些编译器的魔法。 - red75prime&mut **&mut n
和&mut *n
之间的差异(前者是解引用强制转换在该示例中的实际结果),因为可变引用的不变性,它不太可能是必需的安全性要求(因为两个版本执行的操作完全相同),但是寿命可能会比应该的更“紧密”。我现在找不到它了,但这个问题可能已经被报告过了。 - eddybFoo(ref boxed)
,那么*boxed: Box<T>
和**boxed: T
,所以&**boxed: &T
。然而,boxed: &Box<T>
会通过解引用强制转换愉快地转换为&T
。&*boxed: &Box<T>
等同于简单地使用boxed
。 - eddyb