< 返回版块

rdigua 发表于 2019-06-17 23:32

Tags:rust, errors

use std::io::{self, BufRead};
use std::string::*;

fn main() {
    let mut line = String::new();
    let stdin = io::stdin();
    stdin
        .lock()
        .read_line(&mut line)
        .expect("Could not read line");
    let myint = s_to_int(line);
    println!("{:?}", myint);
}

fn s_to_int(s1: String) -> u32 {
    let mut s = String::new();
    for c in s1.chars() {
        match c {
//            '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' => {
            '0'...'9' => {

                s.push(c);
            }
            _ => {}
        }
    }

    if s.len() > 0 {
        return s.parse::<u32>().unwrap();
    } else {
        return 0;
    }
}
  1. 怎么知道 输入已经超过 4294967295 return s.parse::().unwrap();

  2. fn s_to_int 这个函数怎么写成闭包

    let str1:String = str2.chars()
                  .map(|x| match x {
                    '0'...'9' => x,
    //            _ => return       - 报错 
    //            _ => ''          - 报错 
                  _ => x.exit() }  - 报错 
                  ).collect();
  1. 如下方法 屏蔽不了 r123 会报错 有办法么
    let str1 : String = str2.chars() 
             .take_while(|c| c.is_digit(10))
             .collect::<String>(); 
    let myint = str1.parse::<u32>().unwrap();

  1. 发现rust的小词 好多呀 and_then unwrap_or_else add_one is_done 这些有专门的学习文章么

本来打算用来动动秀逗的脑壳的 发现非常的麻烦 有趣的地方太多 难度也尤其大

评论区

写评论
lxfind 2019-07-01 04:09

1. 怎么知道 输入已经超过 4294967295 return s.parse::().unwrap(); 建议先深入了解一下unwrap的用法。通常来说,unwrap是需要避免的,只有在你写一些poof of concept赶时间的情况下才会使用,因为unwrap帮你处理任何可能的错误。 这里你并不需要去check s 是否会超过4294967295或者是空字符串。你可以直接调用parse,然后对结果做match,如果是Err那你就知道它可能是空字符串或者超过了4294967295。像这样:

match s.parse() {
      Ok(x) => x,
      Err(_) => 0,
    }

2. fn s_to_int 这个函数怎么写成闭包 map的用法是将原来的每个值做1对1的转换。在这里你需要filter,而不是map。像这样:

let str1: String = s.chars().filter(|x| x.is_digit(10)).collect();

3. 如下方法 屏蔽不了 r123 会报错 有办法么 这里不应该用take_while,而应该用filter。take_while在遇到第一个不符合条件的字符后就会停下来不再继续找了。"r123" 用take_while之后会返回空字符串,因为第一个字符就不符合你的条件。

作者 rdigua 2019-06-18 00:55

gitter上的回答: Ingvar Stepanyan @RReverser 00:34 I hope I understand your questions right, but if not, feel free to elaborate: You don't need to, .parse takes care of checking limits. Instead of .map, you need to use .take_while. Not sure I understand the question. What would you expect the result to be for string like "r123"? In Rust stdlib docs, e.g. https://doc.rust-lang.org/std/result/enum.Result.html for Result methods.

学习rust 看来真的需要比较好的英语 否则提问都不会

1 共 2 条评论, 1 页