当前位置: 首页 > 知识库问答 >
问题:

我可以通过迭代器在“Vec类型的元素上“构建”一个“Vec类型值”`

丁淇
2023-03-14

代码:

#[derive(Clone)]
pub struct  A{
    pub a: Vec<B>
}
#[derive(Clone)]
pub struct  B {
    pub b: Vec<C>
}

#[derive(Clone)]
pub struct C{
    pub c :i32
}

fn main() {
    let c= C{c :1};
    let b = B{b : vec![c]};
    let a = A{a : vec![b]};
    let va = vec![a];
    let ret=va.iter().map(|x| x.a.clone()).collect::<Vec<B>();;
}

https://play.rust-lang.org/?version=stable

返回此错误:

错误[E0277]:类型为Vec的值

我不明白https://doc.rust-lang.org/std/vec/struct.Vec.html#impl-FromIterator 表示Vec从Iterator实现,不需要T上的条件


共有1个答案

费秦迟
2023-03-14

错误消息意味着迭代器生成的元素属于< code>Vec

可以通过将目标类型更改为Vec来修复它

let ret=va.iter().map(|x| x.a.clone()).collect::<Vec<Vec<B>>>();

或展平元素:

let ret=va.iter().flat_map(|x| x.a.clone()).collect::<Vec<B>>();

游乐场

 类似资料:
  • 我有一个特征Foo,具体类型a和B都由特征Foo限定。我想返回一个

  • 在第七章我们粗略介绍了一下Vec的用法。实际上,作为Rust中一个非常重要的数据类型,熟练掌握Vec的用法能大大提升我们在Rust世界中的编码能力。 特性及声明方式 和我们之前接触到的Array不同,Vec具有动态的添加和删除元素的能力,并且能够以O(1)的效率进行随机访问。同时,对其尾部进行push或者pop操作的效率也是平摊O(1)的。 同时,有一个非常重要的特性(虽然我们编程的时候大部分都不

  • 我正在尝试获取部分应用的函数的列表,如下所示: 编译器向我产生一个错误: 错误[E0277]:类型std::vec::Vec的值 随后的尝试也没有成功: 1. 也只有这一次尝试最终成功了! 为什么在动态闭包方面类型推断如此糟糕? 为什么在第一次尝试中不起作用? 有没有更好的方法来利用类型推理来表达这样的想法?

  • vec

    描述 (Description) 此函数使用指定EXPR的字符串作为无符号整数的向量。 NUMBITS参数是为位向量中的每个条目保留的位数。 这必须是从1到32的2的幂。请注意,偏移量是向量结束的标记,它会计算指定的位数以查找开始。 可以使用逻辑按位运算符|,&和^来操纵向量。 语法 (Syntax) 以下是此函数的简单语法 - vec EXPR, OFFSET, BITS 返回值 (Retur

  • 我有以下内容: 我现在想在的每个元素上调用,并将结果值存储回中。我可以做类似的事情,但这将分配一个新的。有没有一种方法可以就地执行此操作,重用的分配内存?Rust中曾经有,但它已经被删除了一段时间。 作为解决方法,我向 添加了一个变体,然后执行以下操作: 这感觉不对,我必须处理代码中其他任何地方的<code>SomeType::Dummy</code>问题,尽管它不应该在这个循环之外可见。有没有更

  • 我经常遇到这样的情况:我需要定义一组常量,我需要循环遍历它们。比如卡片套装,我需要向用户显示可用套装的列表。 我看到的两个选项是枚举或静态int。但问题是,当我需要遍历列表时,我最终使用了带有values()和Ordinal()的枚举。许多人说使用这些是不好的,您应该回到静态int。 你们是如何在需要迭代的地方编写一组常量的呢?最好的做法是什么? 谢谢