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;
}
}
-
怎么知道 输入已经超过 4294967295 return s.parse::().unwrap();
-
fn s_to_int 这个函数怎么写成闭包
let str1:String = str2.chars()
.map(|x| match x {
'0'...'9' => x,
// _ => return - 报错
// _ => '' - 报错
_ => x.exit() } - 报错
).collect();
- 如下方法 屏蔽不了 r123 会报错 有办法么
let str1 : String = str2.chars()
.take_while(|c| c.is_digit(10))
.collect::<String>();
let myint = str1.parse::<u32>().unwrap();
- 发现rust的小词 好多呀 and_then unwrap_or_else add_one is_done 这些有专门的学习文章么
本来打算用来动动秀逗的脑壳的 发现非常的麻烦 有趣的地方太多 难度也尤其大
1
共 3 条评论, 1 页
评论区
写评论谢谢 明白了。
对以下内容的回复:
1. 怎么知道 输入已经超过 4294967295 return s.parse::().unwrap(); 建议先深入了解一下unwrap的用法。通常来说,unwrap是需要避免的,只有在你写一些poof of concept赶时间的情况下才会使用,因为unwrap帮你处理任何可能的错误。 这里你并不需要去check s 是否会超过4294967295或者是空字符串。你可以直接调用parse,然后对结果做match,如果是Err那你就知道它可能是空字符串或者超过了4294967295。像这样:
2. fn s_to_int 这个函数怎么写成闭包 map的用法是将原来的每个值做1对1的转换。在这里你需要filter,而不是map。像这样:
3. 如下方法 屏蔽不了 r123 会报错 有办法么 这里不应该用take_while,而应该用filter。take_while在遇到第一个不符合条件的字符后就会停下来不再继续找了。"r123" 用take_while之后会返回空字符串,因为第一个字符就不符合你的条件。
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 看来真的需要比较好的英语 否则提问都不会