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循环中的范围,它不会感觉到惯用的代码.
是否可以压缩l
并r
获得对该元素的可变引用以及对该元素l
的非可变引用r
?
(注意,我没有检查向量的长度.我知道这会在现实生活中爆炸,但我想现在关注for循环)
您将使用.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操作
BitXor
.IntoIterator
参数而不仅仅是切片.请注意,zip
只要两个迭代器中的较短者完成,它就会停止.