gpt4 book ai didi

rust - 将切片过滤成向量

转载 作者:行者123 更新时间:2023-11-29 08:16:42 36 4
gpt4 key购买 nike

我有一个结构:

enum Bar {
Bar0,
Bar1,
Bar2
}

struct Foo {
bar: Bar
}

我有一个获取 Foos 片段的函数:

fn do_the_thing(foos: &[Foo]) { ... }

部分需要做的事情是在切片的所有元素上调用另一个函数,这些元素具有相同的“bar”值:

fn another_func(foos: &[Foo]) { ... }

我试过这样的:

fn do_the_thing(foos: &[Foo]) { 
let bar0_foos = foos.iter().filter(|f| f.bar == Bar0 );

another_func(&bar0_foos);
}

可悲的是,有人告诉我 bar0_foos 是一个 &std::iter::Filter<std::slice::Iter<...>> .我也试过:

fn do_the_thing(foos: &[Foo]) { 
let bar0_foos = foos.iter().filter(|f| f.bar == Bar0 ).collect();

another_func(&bar0_foos);
}

在这里,我被告知 std::marker::Sized不满意。

那么,这样做的正确方法是什么?我应该吃一片以外的东西吗?

最佳答案

std::marker::Sized is not satisfied.

Iterator::collect返回泛型类型,编译器使用类型推断来确定该类型必须是什么。在这种情况下,您要传递对 bar0_foos 的引用。到接受 &[Foo] 的函数.据推论,这意味着 bar0_foos必须是 [Foo] 类型.

[Foo]是未确定大小的类型,您不能创建该类型的值。

通常,您指定要收集到的集合类型:

let bar0_foos: Vec<_> = // ...

它提供了这个错误:

error: mismatched types:
expected `&[Foo]`,
found `&collections::vec::Vec<&Foo>`
(expected slice,
found struct `collections::vec::Vec`) [E0308]
<anon>:10 another_func(&bar0_foos);
^~~~~~~~~~

这里的错误消息有点误导,因为 Vec<T>可以作为 &[T] 运行,所以这不是真正的问题。包含的类型是问题所在:您有一个 Vec<&Foo> 的集合但需要传递一个 &[Foo] .

从逻辑上讲,错误是有道理的。您的函数需要一 block 内存,代表 Foo连续范围,但这不是你所拥有的。通过过滤,您有可能获得不连续的数据。此外,您还创建了一系列指向真实数据的指针。

如何解决?

  1. 如果您控制 another_func ,您可以将其更改为接受 &[&Foo] .
  2. 您可以将其更改为更通用

    fn another_func<F>(foos: &[F]) 
    where F: Borrow<Foo>
  3. 您可以复制/克隆这些值并创建一个新向量。然后你会有一个 Vec<Foo>可以作为 &[Foo] 传入.
  4. 您可以重新排序输入切片以放置所有适当的 Foo s 在一起,然后取一个子切片。

关于rust - 将切片过滤成向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801375/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com