gpt4 book ai didi

generics - 借用的值对于 `AsRef` 结果来说生命周期不够长,即使它的 `self` 生命周期足够长

转载 作者:行者123 更新时间:2023-11-29 08:04:49 24 4
gpt4 key购买 nike

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

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 )...

最佳答案

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 trait 似乎不适合这个用例。该特征的想法是将某些数据的所有权转移到新类型,但是您的 SliceWrapper不取得所有权。我建议编写一个自定义构造函数而不是采用 R通过引用。

关于generics - 借用的值对于 `AsRef` 结果来说生命周期不够长,即使它的 `self` 生命周期足够长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53437716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com