代码之家  ›  专栏  ›  技术社区  ›  Winston

如何使用具有多个输出的映射?

  •  0
  • Winston  · 技术社区  · 2 年前

    到目前为止,我使用 map 起到1-1关系的作用,例如以下示例:

    let vector = [1, 2, 3];
    let result: Vec<_> = vector.iter().map(|x| x * 2).map(|x| x + 1).collect();
    println!("After mapping: {:?}", result);
    // After mapping: [3, 5, 7]
    

    在这个例子中有2个 地图 函数和这两个函数具有1-1的关系。我想知道如何更改代码,使第一映射函数可以向第二映射函数提供输出倍数(例如2)的输出?

    2 回复  |  直到 2 年前
        1
  •  1
  •   Zohair    2 年前

    要在示例的上下文中实现一对多关系,可以使用 flat_map 作用以下是修改代码的方法:

    let vector = [1, 2, 3];
    let result: Vec<_> = vector
        .iter()
        .flat_map(|x| vec![x * 2, x * 3]) // Modify this line to produce multiple outputs
        .map(|x| x + 1)
        .collect();
    println!("After mapping: {:?}", result);
    

    在这个例子中, 平面映射(_M) 采用一个生成迭代器的闭包,结果被扁平化为一个迭代器。在这里,我用过 vec![x * 2, x * 3] 以针对原始向量中的每个元素产生两个输出。后续 map 然后对这些值中的每一个进行运算,得到最终的映射向量 [3, 4, 5, 6, 7, 10] .

        2
  •  1
  •   ShadowRanger    2 年前

    如果一个的输出 map 应该变成两个值作为下一个的参数 地图 ,最简单的方法是拥有第一个 地图 生成 tuple ,而第二个接受 元组 破坏。

    例如

    let result: Vec<_> = vector.iter().map(|x|(x * x, x * 2)).map(|(square, double)| square > double).collect();
    

    其计算输入值的平方和加倍 元组 ,然后在下一个中销毁它们 地图 的论点。

    注意之间的区别 |(square, double)| (取一个已知为二的自变量的闭包- 元组 可以被破坏)以及 |square, double| (需要两个论据的闭包)。 地图 只传递和接收单个参数,但由于析构函数,您可以模拟传递任意数量的参数)。

    如果目标是生成多个值,但仍将它们作为参数单独传递给下一层(例如,对第一层的10次调用 地图 闭包产生20个到下一个的调用 地图 闭合),然后 flat_map 是要走的路;只是替换 地图 具有 平面映射(_M) ,并生成值数组而不是单个值:

    let result: Vec<_> = vector.iter().flat_map(|x|[x, -x]).map(|x| x + 1).collect();
    

    这比每个输入的正值和负值多产生一个。

    推荐文章