我有一个相当简单的函数(让我们将其命名为cross),该函数接受两个类型为&[u32]的参数,并且我希望返回类型为&[u32].此函数接受两个片(数组?),并返回一个新的片(数组?),其中包含两个片中的元素.

pub fn intersection<'a>(left: &'a [u32], right: &'a [u32]) -> &'a [u32] {
    let left_set: HashSet<u32> = left.iter().cloned().collect();
    let right_set: HashSet<u32> = right.iter().cloned().collect();
    
    // I can't figure out how to get a
    // `&[u32]` output idiomatically  
    let result: &[u32] = left_set
        .intersection(&right_set)
        .into_iter()
        .....
        .....

    
    result //<- this is a slice
}

我想我可以做一些事情,比如创造一个Vec<u32>,但然后借入收银员不喜欢我退还这Vec<u32>.

pub fn intersection<'a>(left: &'a [u32], right: &'a [u32]) -> &'a [u32] {
   .....
   .....
   let mut result: Vec<u32> = left_set
        .intersection(&right_set)
        .into_iter()
        .cloned()
        .collect();
    result.sort();

    result.as_slice()  //<-- ERROR cannot return reference to local variable 
      // `result` returns a reference to data owned by the current function
}

我可能错过了一个小把戏.对于如何在《铁 rust 》中用习语来做这件事,有什么建议吗?

推荐答案

此函数接受两个数组

不,要两个slices美元.

我可能错过了一个小把戏.对于如何在《铁 rust 》中用习语来做这件事,有什么建议吗?

分片是一种borrow 形式,根据定义,分片指的是其他集合(静态内存、向量、数组等)拥有的内存.

这意味着,就像所有其他借入一样,如果它从本地作用域借入数据,则不能返回它,这将导致指针悬空(因为当作用域结束时,实际所有者将被销毁).

正确的做法是只返回Vec:

pub fn intersection<'a>(left: &'a [u32], right: &'a [u32]) -> Vec<u32> {
   left.iter().collect::<HashSet<_>>().intersection(
       &right.iter().collect()
   ).map(|&&v| v).collect()
}

或者,如果其中一个切片是另一个and切片的子集是很常见的,您很乐意为支票买单(可能是因为您可以使用位图之类的东西),您可以返回Cow,在子集情况下返回子集切片:

pub fn intersection<'a>(left: &'a [u32], right: &'a [u32]) -> Cow<'a, [u32]> {
    if issubset(left, right) {
        Cow::Borrowed(left)
    } else if issubset(right, left) {
        Cow::Borrowed(right)
    } else {
        Cow::Owned(
            left.iter().collect::<HashSet<_>>().intersection(
                &right.iter().collect()
            ).map(|&&v| v).collect()
        )
    }
}

Rust相关问答推荐

如何将元素添加到向量并返回对该元素的引用?

通过解引用将值移出Box(以及它被脱糖到什么地方)?

闭包不会发送,即使它只捕获发送变量

关于 map 闭合求和的问题

Rust 中的静态引用

详尽的匹配模式绑定

使用 Option 来分配?

没有明确地说return会产生错误:match arms have incompatible types

仅当函数写为闭包时才会出现生命周期错误

我的 Axum 处理程序无法编译:未实现 IntoResponse 特征

在异步 Rust 中,Future 如何确保它只调用最近的 Waker?

Rust 将特性传递给依赖项

为什么允许重新分配 String 而不是 *&String

为什么在 macOS / iOS 上切换 WiFi 网络时 reqwest 响应会挂起?

用逗号分隔字符串,但在标记中使用逗号

意外的正则表达式模式匹配

为什么这个闭包没有比 var 长寿?

为什么这个值在上次使用后没有下降?

list 中没有指定目标 - 必须存在 src/lib.rs、src/main.rs、[lib] 部分或 [[bin]] 部分

为什么在使用 self 时会消耗 struct 而在解构时不会?