压缩可变矢量迭代器的惯用Rust代码

Pet*_*mit 2 iterator vector idiomatic mutable rust

我正在尝试使用Rust(以一种惯用的方式)进行Matasano crytpo挑战.

第二个任务是xor两个向量.我现在的代码是:

extern crate rustc_serialize;

use rustc_serialize::hex::{FromHex,ToHex};

pub fn fixed_xor(l: &str, r: &str) -> String {
    let mut l = l.from_hex().unwrap();
    let r = r.from_hex().unwrap();
    for i in 0..l.len() {
        l[i] ^= r[i];
    }
    return l.to_hex();
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,但由于for循环中的范围,它不会感觉到惯用的代码.

是否可以压缩lr获得对该元素的可变引用以及对该元素l的非可变引用r

(注意,我没有检查向量的长度.我知道这会在现实生活中爆炸,但我想现在关注for循环)

blu*_*uss 5

您将使用.zip()迭代器适配器,例如:

pub fn xor_in_place(l: &mut [u8], r: &[u8]) {
    for (x, y) in l.iter_mut().zip(r) {
        *x ^= *y;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以考虑通过任一方式推广此XOR操作

  1. 接受实现的所有元素类型BitXor.
  2. 接受泛型IntoIterator参数而不仅仅是切片.

请注意,zip只要两个迭代器中的较短者完成,它就会停止.

  • 有趣的是,只要两个迭代器中的较短者停止,“ zip”都将停止,从而避免了走到最后的可能性。 (2认同)