【问题标题】:How can I reverse sub-vectors in a vector?在 Rust 中取消引用向量的问题
【发布时间】:2022-12-20 10:08:19
【问题描述】:

考虑以下代码。


fn main() {
    let mut rows: Vec<Vec<u32>> = Vec::from([
        Vec::from([1, 2, 3]),
        Vec::from([4, 5, 6]),
        Vec::from([7, 8, 9]),
    ]);

    let res: Vec<Vec<u32>> = rows.iter().map(|arr| arr.reverse()).collect();
}

我有一个整数向量的向量,我想反转 rows 中存在的每个数组。

使用此代码会出现类型注释问题,其中map 函数认为arr 属于&amp;Vec&lt;u32&gt; 类型,而.reverse() 期望它属于Vec&lt;u32&gt; 类型。

我怎样才能克服它?

【问题讨论】:

    标签: rust


    【解决方案1】:

    要解决此问题,您可以使用 .clone() 方法创建一个与原始 arr 具有相同元素的新 Vec。这允许您在新 Vec 上调用 .reverse() 方法,而不是对原始 Vec 的引用。修改后的代码如下所示:

    fn main() {
        let mut rows: Vec<Vec<u32>> = Vec::from([
            Vec::from([1, 2, 3]),
            Vec::from([4, 5, 6]),
            Vec::from([7, 8, 9]),
        ]);
    
        let res: Vec<Vec<u32>> = rows.iter().map(|arr| arr.clone().reverse()).collect();
    }
    

    或者,您可以使用 .as_slice() 方法将 arr 转换为切片,它具有可以直接调用的 .reverse() 方法。这看起来像这样:

    fn main() {
        let mut rows: Vec<Vec<u32>> = Vec::from([
            Vec::from([1, 2, 3]),
            Vec::from([4, 5, 6]),
            Vec::from([7, 8, 9]),
        ]);
    
        let res: Vec<Vec<u32>> = rows.iter().map(|arr| arr.as_slice().reverse()).collect();
    }
    

    这两种解决方案都应该解决类型注释问题,并允许您反转行中每个内部 Vec 中的元素。

    【讨论】:

    • 由于 reverse 返回 (),您的解决方案均无效。
    • 你是对的,我在之前的回复中提供的解决方案是不正确的,因为 reverse() 方法没有返回值。 reverse() 方法就地修改向量并且不返回新向量。要解决此问题,您可以使用 .clone() 方法创建一个与原始 arr 具有相同元素的新 Vec,然后使用 .reverse() 方法将新 Vec 反转到位。反转新的 Vec 后,您可以从 map() 函数返回它。
    • 或者,您可以使用 .as_slice() 方法将 arr 转换为切片,它具有可以直接调用的 .reverse() 方法。就地反转切片后,您可以将其转换回 Vec 并从 map() 函数返回它。
    【解决方案2】:

    1.如果你不再需要原来的rows

    你也可以使用into_iter

    fn main() {
        let mut rows: Vec<Vec<u32>> = Vec::from([
            Vec::from([1, 2, 3]),
            Vec::from([4, 5, 6]),
            Vec::from([7, 8, 9]),
        ]);
    
        let res: Vec<Vec<u32>> = rows.into_iter().map(|mut arr| {arr.reverse(); arr}).collect();
    }
    

    或使用iter_mut就地进行:

    fn main() {
        let mut rows: Vec<Vec<u32>> = Vec::from([
            Vec::from([1, 2, 3]),
            Vec::from([4, 5, 6]),
            Vec::from([7, 8, 9]),
        ]);
        rows.iter_mut().for_each(|mut arr| arr.reverse());
    }
    

    2. 如果之后确实需要rows

    fn main() {
        let mut rows: Vec<Vec<u32>> = Vec::from([
            Vec::from([1, 2, 3]),
            Vec::from([4, 5, 6]),
            Vec::from([7, 8, 9]),
        ]);
    
        let res: Vec<Vec<u32>> = rows.iter().map(|arr| {
            let mut arr = arr.clone();
            arr.reverse();
            arr
        }).collect();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2018-08-08
      相关资源
      最近更新 更多