如何在不克隆的情况下获得 &[u8] 的所有权?

dop*_*umi 1 lifetime rust

轮询一系列事件时,需要丢弃重复项。

事件可以使用 序列化为字节.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`
}

Run Code Online (Sandbox Code Playgroud)

在闭包中,我们需要将move事件从其中取出,以便它们的生命周期与事件一样长cache

一种方法是拜访.to_owned()他们。然而,对于 [u8] 值,这被实现为 a .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`
Run Code Online (Sandbox Code Playgroud)

如何&[u8]在不产生与复制相关的额外开销的情况下移出闭包?

Jer*_*ows 5

正如评论中提到的,你不能拥有借来的东西。想象一下,借用邻居的汽车,并试图保留它……这不会有什么好结果。

一个u8impls Copy,这意味着创建它的新实例是一个简单的按位复制,不会产生任何额外的开销,就像您所说的您担心的那样。

Rust 编译器确实令人印象深刻,它告诉您通过使用to_vec()获取拥有的 Vec 来尝试完成它认为您想做的事情的最佳解决方案。

  • `to_vec()` 分配和复制。它确实增加了开销,并且可能是不可忽略的开销。“u8” 实现“Copy” 的事实在这里根本不相关。 (6认同)