【发布时间】:2018-05-08 14:34:28
【问题描述】:
结构体定义为:
struct Node {
set: HashSet<usize>,
// other fields omitted
}
我必须为一个特征(兼容性问题)实现一个函数,该函数需要将集合中的所有元素作为切片返回。
我知道以下功能不起作用:
impl Node {
pub fn set_slice(&self) -> &[usize] {
let elems: Vec<_> = self.set.iter().cloned().collect();
&elems[..]
}
}
问题是:
error[E0597]: `elems` does not live long enough
--> src/main.rs:11:10
|
11 | &elems[..]
| ^^^^^ borrowed value does not live long enough
12 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the anonymous lifetime #1 defined on the method body at 9:5...
--> src/main.rs:9:5
|
9 | / pub fn set_slice(&self) -> &[usize] {
10 | | let elems: Vec<_> = self.set.iter().cloned().collect();
11 | | &elems[..]
12 | | }
| |_____^
我知道这个要求可能听起来很奇怪。尽管我必须这样做,但有什么“好”的方法可以实现这一目标吗?
如果可能的话,我想保留 HashSet 容器以进行 O(1) 查找,并且我不想引入新的结构成员以节省内存。
【问题讨论】:
-
这里可能存在 XY 问题。考虑展示更多关于使用该特征的上下文。还要记住owning containers such as
Veccan coerce to slices.