Skip to content

Instantly share code, notes, and snippets.

@compressed
Forked from anonymous/playground.rs
Created February 1, 2016 15:08
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save compressed/6b4c928d24b56e12e3d4 to your computer and use it in GitHub Desktop.
Save compressed/6b4c928d24b56e12e3d4 to your computer and use it in GitHub Desktop.
rust: map + filter_map + Result examples
use std::collections::HashMap;
fn main() {
// println!("{:?}", go(&[1, 2, 3]));
// println!("{:?}", go(&[1, 3, 4, 5, 6]));
println!("go_while {:?}", go_while(&[1, 3, -4, 4, 5, 6]));
println!("go_filter_map {:?}", go_filter_map(&[1, 3, 4, -4, 5, 6]));
let mut hm = HashMap::new();
hm.insert(1,3);
hm.insert(1,8);
hm.insert(1,3);
//println!("{:?}", hm);
// let v = vec![2,3,4,5,6];
// let v2 = go(&v);
// println!("v2 = {:?}", v2);
// let q: Vec<_> = v.into_iter()
// .map(|x| {
// if x < 5 { Some(x) }
// // else if x == 6 { Err(
// else {None }
// })
// .filter_map(|x| {
// x
// })
// .collect();
// println!("{:?}", q);
}
fn go(v: &[isize]) -> Result<Vec<isize>, String> {
// Ok(1)
// Ok(3)
// Ok(4)
// &[Ok(1), Ok(3) ..]
// Ok([1, 3, ..])
v.iter().map(|&n| is_positive(n)).collect()
}
fn go_while(v: &[isize]) {
// Ok(1)
// Ok(3)
// Ok(4)
// &[Ok(1), Ok(3) ..]
// Ok([1, 3, ..])
let q = v.iter().map(|&n| is_positive(n)).skip_while(|g| g.is_ok()).nth(0);
println!("{:?}", q);
}
fn go_filter_map(v: &[isize]) {
// Ok(1)
// Ok(3)
// Ok(4)
// &[Ok(1), Ok(3) ..]
// Ok([1, 3, ..])
let q: Result<Vec<()>, String> = v.iter().filter_map(|&n| {
match is_positive(n) {
Err(e) => Some(Err(e)),
_ => None,
}
}).collect();
println!("q={:?}", q);
}
fn is_positive(n: isize) -> Result<isize, String> {
println!("n={:?}", n);
if n > 0 {
Ok(n)
} else {
Err(format!("{:?} is not positive!", n))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment