如何在不克隆的情况下获得 &[u8] 的所有权?
How do I get ownership of a &[u8] without cloning?
轮询一系列事件,需要丢弃重复项。
可以使用 .as_bytes()
将事件序列化为字节,然后可以将其放入缓存中以便跳过它们:
let mut cache = LruCache::new(10_000);
loop {
let events: Vec<Evt> = get_events().
.into_iter()
.filter_map(|evt| {
let key = evt.as_bytes().to_owned();
if cache.contains(&key) {
return None;
}
cache.put(key);
Some(Event::from_bytes(&evt.as_bytes()).unwrap())
})
.collect();
// ... use `events`
}
在闭包中,我们需要 move
将事件从中移除,以便它们的生命周期与 cache
一样长。
一种方法是对它们调用 .to_owned()
。但是,对于 [u8] 值,这是作为 .to_vec()
实现的,它复制它们而不是移动它们,从而产生额外的开销。
显然 [T]
切片实现了 .into_vec()
方法,但这在 &[u8]
引用中不可用:
error[E0599]: no method named `into_vec` found for reference `&[u8]` in the current scope
--> src/main.rs:55:41
|
55 | let key = evt.as_bytes().into_vec();
| ^^^^^^^^^^ help: there is an associated function with a similar name: `to_vec`
如何 &[u8]
移出闭包,而不产生与复制相关的额外开销成本?
正如评论中提到的,你不能拥有借来的东西。想象一下,借用邻居的车,并试图保留它……这不会很顺利。
A u8
impls Copy
,这意味着创建它的新实例是一个简单的 bit-wise 副本,它将 而不是 产生任何额外的开销,就像你说的你担心的那样。
Rust 编译器真的令人印象深刻,它告诉您最好的解决方案,通过使用 to_vec()
获得一个拥有的 Vec 来尝试完成它认为您想要做的事情。
您需要使引用的生命周期足够长,使用 Rc
/Arc
/类似的,或者将数据复制到 Vec
。另见 std::collections::HashSet
and itertools::Itertools:: unique_by
。
轮询一系列事件,需要丢弃重复项。
可以使用 .as_bytes()
将事件序列化为字节,然后可以将其放入缓存中以便跳过它们:
let mut cache = LruCache::new(10_000);
loop {
let events: Vec<Evt> = get_events().
.into_iter()
.filter_map(|evt| {
let key = evt.as_bytes().to_owned();
if cache.contains(&key) {
return None;
}
cache.put(key);
Some(Event::from_bytes(&evt.as_bytes()).unwrap())
})
.collect();
// ... use `events`
}
在闭包中,我们需要 move
将事件从中移除,以便它们的生命周期与 cache
一样长。
一种方法是对它们调用 .to_owned()
。但是,对于 [u8] 值,这是作为 .to_vec()
实现的,它复制它们而不是移动它们,从而产生额外的开销。
显然 [T]
切片实现了 .into_vec()
方法,但这在 &[u8]
引用中不可用:
error[E0599]: no method named `into_vec` found for reference `&[u8]` in the current scope
--> src/main.rs:55:41
|
55 | let key = evt.as_bytes().into_vec();
| ^^^^^^^^^^ help: there is an associated function with a similar name: `to_vec`
如何 &[u8]
移出闭包,而不产生与复制相关的额外开销成本?
正如评论中提到的,你不能拥有借来的东西。想象一下,借用邻居的车,并试图保留它……这不会很顺利。
A u8
impls Copy
,这意味着创建它的新实例是一个简单的 bit-wise 副本,它将 而不是 产生任何额外的开销,就像你说的你担心的那样。
Rust 编译器真的令人印象深刻,它告诉您最好的解决方案,通过使用 to_vec()
获得一个拥有的 Vec 来尝试完成它认为您想要做的事情。
您需要使引用的生命周期足够长,使用 Rc
/Arc
/类似的,或者将数据复制到 Vec
。另见 std::collections::HashSet
and itertools::Itertools:: unique_by
。