enums - 为什么我不能从枚举中可变地借用一个原语?

标签 enums rust borrow-checker

我希望能够获得对 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 does not live long enough

我能够提供类似函数的两种变体来访问 Foo 的其他内容,这些内容是 Boxed - 为什么可变借用(以及为什么只有它)失败了未装箱的原件?

最佳答案

您需要将 Bar(ref mut n) => &mut n 替换为 Bar(ref mut n) => n

当你在 Bar(ref mut n) 中使用 ref mut n 时,它会创建一个可变的 引用Bar中的数据,所以n的类型是&mut usize。 然后你尝试返回 &mut &mut u32 类型的 &mut n

This part is most likely incorrect.

Now deref coercion kicks in and converts &mut n into &mut *n, creating a temporary value *n of type usize, which doesn't live long enough.

关于enums - 为什么我不能从枚举中可变地借用一个原语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44089525/

相关文章:

c++ - 模板类中的枚举

ruby-on-rails - 在构造 SQL 查询时,ActiveRecord 是否处理按值查找 `enum` ?

data-structures - 是否有 `Entry`的 `BTreeMap`机制允许返回不可变的引用?

arrays - 查找数组元素的所有唯一组合的最佳方法?

return - 为什么提早归还未完成未偿还的借贷?

c# - 使用 C# 枚举标志根据按位或运算的值返回一组值

java - 通过反射获取枚举值

function - 缺少顶级功能的实现

rust - 为什么在调用一个方法时会借用一个移动的值,该方法使用也调用方法的参数来按值获取 self ?

正则表达式捕获迭代器方法移动迭代器