如何在不克隆的情况下获得 &[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