Нет, ваши требования на 100% абсолютно невозможны в безопасной среде Rust.
A HashSet
/ HashMap
не имеют непрерывного сбора данных, поэтому нет возможности получить срез из них.
Если вы можете что-то изменить, у вас есть варианты.
Вы можете «визуализировать» представление HashSet
, если вы можете сохранить Vec
и метод &mut self
:
struct Node {
set: HashSet<usize>,
view: Vec<usize>,
// other fields omitted
}
impl Node {
pub fn set_slice(&mut self) -> &[usize] {
self.view.clear();
self.view.extend(self.set.iter().cloned());
&self.view
}
}
Вы можете вернуть Cow
, который будет либо заимствован, либо принадлежит:
use std::borrow::Cow;
impl Node {
pub fn set_slice(&self) -> Cow<[usize]> {
self.set.iter().cloned().collect::<Vec<_>>().into()
}
}
Вы можете вернуть итератор для значений :
impl Node {
pub fn set_slice<'a>(&'a self) -> impl Iterator<Item = &'a usize> + 'a {
self.set.iter()
}
}
Существует возможно ящик , который использует плотно упакованный Vec
в качестве резервного хранилища, которое затем может быть выставлено в виде среза.