我希望能够获得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岁还不够长寿

我能够提供类似函数的两个变体,它们访问FooBoxed的其他内容——为什么可变借阅(以及为什么只有它)在未绑定原语时失败?

推荐答案

以下示例显示了示例问题:

fn implicit_reborrow<T>(x: &mut T) -> &mut T {
    x
}

fn explicit_reborrow<T>(x: &mut T) -> &mut T {
    &mut *x
}

fn implicit_reborrow_bad<T>(x: &mut T) -> &mut T {
    &mut x
}

fn explicit_reborrow_bad<T>(x: &mut T) -> &mut T {
    &mut **&mut x
}

explicit_个版本显示了编译器从deref coercions个版本推断出的结果

这要么是一个bug,要么是编译器当前实现生命周期的限制.&mut TT might的不变性与此有关,因为它导致&mut &'a mut T'a不变性,因此在推理过程中比共享参考(&&'a T)情况下的more restrictive不变性,即使in this situation严格性是不必要的.

Rust相关问答推荐

是否有一种可靠的方法可以将Arc弦乐转换/转换为Arc Vec u8>>

支持TLS的模拟HTTP服务器

为什么铁 rust S似乎有内在的易变性?

为什么这个变量不需要是可变的?

`Pin`有没有不涉及不安全代码的目的?

在文件链实施中绕过borrow 判断器

通过异常从同步代码中产生yield 是如何工作的?

面临意外的未对齐指针取消引用:地址必须是 0x8 的倍数,但为 0x__错误

max(ctz(x), ctz(y)) 有更快的算法吗?

如何在 Rust 中按 char 对字符串向量进行排序?

为什么 `tokio::join!` 宏不需要 Rust 中的 `await` 关键字?

如何将这些测试放在一个单独的文件中?

内部值发生变化时 Rc 的行为

为什么 for_each 在释放模式(cargo run -r)下比 for 循环快得多?

为什么 i32 Box 类型可以在 Rust 中向下转换?

是否可以在 Rust 中的特定字符上实现特征?

`use std::error::Error` 声明中断编译

从 Cranelift 发出 ASM

有没有办法在 Rust 中对 BigInt 进行正确的位移?

在 Rust 中组合特征的不同方法是否等效?