generics - 借来的值对于“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
) 寿命......
解决方案
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
通过引用获取。
推荐阅读
- matlab - Solve non-linear equation numerically on MATLAB
- sql-server - Glue crawler not creating table for SQL Server data source
- javascript - How to push into an array using nodejs
- c - 自动配置忽略 CFLAGS?
- python - Calling External Command using 'for' or 'While' loop
- liquibase - liquibase sqlFile complains that "File does not exist"
- ios - 在 iOS 模拟器上运行 Safari
- python-3.x - Number guessing game that requires suggestions for completion
- php - Hide DIV or button based on query result
- pytest - How to assert a class is decorated by a function in unit test in Python?