< 返回版块

rdigua 发表于 2021-01-27 15:49

Tags:rust,learning

    let size;
    match std::env::args().nth(1) {
        Some(a) => size = a,
        _ => return,
    }

    let size = size.chars().filter(|x| x.is_digit(10)).collect::<String>();
    if size.is_empty() {
        return;
    }

    let size = size.parse::<usize>().unwrap();

上面几句能够连在一起 一气顺溜下面么 类似

    let size= std::env::args().
              .nth(1) //需要加上 None Return
              .unwrap()
              .chars()
              .filter(|x| x.is_digit(10))
              .collect::<String>()  //需要加上 is_empty Return
              .parse::<usize>()
              .unwrap();

评论区

写评论
93996817 2021-01-28 11:05
// 修改如下
  let size=std::env::args().nth(1)
  .map(|a|a.chars().filter(|a| a.is_digit(10)) 
  .fold(None, |sum, i| Some(sum.unwrap_or(0)*10 + i as usize-48))).unwrap();
  println!("{:?}",size);
   /*  TomRust
    .\test001.exe                      None
    .\test001.exe    "a1b2c3"          Some(123)
    .\test001.exe    "abc"             None
    .\test001.exe     "-1"             Some(1)
   */
c5soft 2021-01-28 07:45

亲的代码重新排版一下:

fn get_arg1_c() -> Option<usize> {
    std::env::args().nth(1).map(|a| {
        a.chars()
            .filter(|a| a.is_digit(10))
            .fold(0usize, |sum, i| sum * 10 + i.to_digit(10).unwrap() as usize)
    })
}

加上楼下的a和b调用:

fn main() {
    println!("get_arg1_a()={:?}", get_arg1_a());
    println!("get_arg1_b()={:?}", get_arg1_b());
    println!("get_arg1_c()={:?}", get_arg1_c());
}

c的实际运行结果与a和b不一样: cargo r any-none-digit

get_arg1_a()=None
get_arg1_b()=None
get_arg1_c()=Some(0)

--
👇
93996817

93996817 2021-01-27 23:22
    let size=std::env::args()
    .nth(1)
    .map(|a|a.chars().filter(|a| a.is_digit(10))
    .fold(0,|sum,i|sum*10 + i.to_digit(10).unwrap()));
    println!("{:?}",size);

    /*  TomRust
        cargo run             None
        cargo run   "a1b2c3"  Some(123)
    */
c5soft 2021-01-27 19:57

fn get_arg1_a()->Option<usize>{
    let size;
    match std::env::args().nth(1) {
        Some(a) => size = a,
        _ => return None,
    }

    let size = size.chars().filter(|x| x.is_digit(10)).collect::<String>();
    if size.is_empty() {
        return None;
    }

    let size = size.parse::<usize>().unwrap();
    Some(size)
}

fn get_arg1_b()->Option<usize>{
    std::env::args()
        .nth(1)
        .and_then(|size|Some(size.chars().filter(|x| x.is_digit(10)).collect::<String>()))
        .and_then(|size| size.parse::<usize>().ok())
}

fn main() {
    println!("{:?}",get_arg1_a());
    println!("{:?}",get_arg1_b());
}

作者 rdigua 2021-01-27 17:40

谢谢。

puzc1993 2021-01-27 17:28
let size: Option<usize> = std::env::args()
        .nth(1)
        .and_then(|size| {
            let size = size.chars().filter(|x| x.is_digit(10)).collect::<String>();
            if size.is_empty() {
                None
            } else {
                Some(size)
            }
        })
        .and_then(|size| Some(size.parse::<usize>().unwrap()));
1 共 6 条评论, 1 页