首页 > 解决方案 > 借来的值对于“AsRef”结果的寿命不够长,即使它的“自我”寿命足够长

问题描述

我有一个将一些功能包装在切片周围的结构:

use std::fmt::Debug;

struct SliceWrapper<'a, T: Debug + Copy + 'a> {
    slice: &'a [T],
    pos: usize,
}

我想From为每个支持AsRef<T: Debug + Copy + 'a>这样的元素实现特征:

impl<'a, T: Debug + Copy + 'a, R: AsRef<[T]> + 'a> From<R> for SliceWrapper<'a, T> {
    fn from(slice: R) -> Self {
        Self {
            slice: slice.as_ref(),
            pos: 0,
        }
    }
}

我得到错误:

error[E0597]: `slice` does not live long enough
  --> src/lib.rs:11:20
   |
11 |             slice: slice.as_ref(),
   |                    ^^^^^ borrowed value does not live long enough
...
14 |     }
   |     - borrowed value only lives until here
   |
note: borrowed value must be valid for the lifetime 'a as defined on the impl at 8:6...
  --> src/lib.rs:8:6
   |
8  | impl<'a, T: Debug + Copy + 'a, R: AsRef<[T]> + 'a> From<R> for SliceWrapper<'a, T> {
   |      ^^

我不明白这一点,因为我说R( slice) 必须与我的寿命一样长SliceWrapper——据我所知,它AsRef<_>继承了它的self( slice) 寿命......

标签: genericsrusttraitslifetime

解决方案


nightly 上的完整错误消息非常清楚地说明了这里发生了什么。您slice进入函数from(),然后使用 借用它as_ref(),然后它在作用域的末尾被删除:

8  | impl<'a, T: Debug + Copy + 'a, R: AsRef<[T]> + 'a> From<R> for SliceWrapper<'a, T> {
   |      -- lifetime `'a` defined here
9  |     fn from(slice: R) -> Self {
10 |         Self{ slice: slice.as_ref(), pos: 0 }
   |                      ^^^^^---------
   |                      |
   |                      borrowed value does not live long enough
   |                      argument requires that `slice` is borrowed for `'a`
11 |     }
   |     - `slice` dropped here while still borrowed

您正在尝试创建一个可以终生使用'a的借款,但您向其借款的所有者 ,的寿命slice不够长。

From特征似乎不适合此用例。该特征的想法是将某些数据的所有权转移到新类型,但您SliceWrapper不拥有所有权。我建议编写一个自定义构造函数,而不是R通过引用获取。


推荐阅读