速成课第3节-练习解答
练习1
use std::env::{args, Args};
use std::iter::Skip;
fn main() {
let args: Skip<Args> = args().skip(1);
for arg in args {
println!("{}", arg);
}
}练习2
练习3
练习4
练习5
最后更新于
use std::env::{args, Args};
use std::iter::Skip;
fn main() {
let args: Skip<Args> = args().skip(1);
for arg in args {
println!("{}", arg);
}
}最后更新于
#[derive(Debug)]
struct Frame {
width: u32,
height: u32,
}
#[derive(Debug)]
enum ParseError {
TooFewArgs,
TooManyArgs,
InvalidInteger(String),
}
struct ParseArgs(std::env::Args);
impl ParseArgs {
fn new() -> ParseArgs {
ParseArgs(std::env::args())
}
fn require_arg(&mut self) -> Result<String, ParseError> {
match self.0.next() {
None => Err(ParseError::TooFewArgs),
Some(s) => Ok(s),
}
}
fn require_no_args(&mut self) -> Result<(), ParseError> {
match self.0.next() {
Some(_) => Err(ParseError::TooManyArgs),
None => Ok(()),
}
}
}
fn parse_u32(s: String) -> Result<u32, ParseError> {
match s.parse() {
Err(_) => Err(ParseError::InvalidInteger(s)),
Ok(x) => Ok(x),
}
}
fn parse_args() -> Result<Frame, ParseError> {
let mut args = ParseArgs::new();
// skip the command name
args.require_arg()?;
let width_str = args.require_arg()?;
let height_str = args.require_arg()?;
args.require_no_args()?;
let width = parse_u32(width_str)?;
let height = parse_u32(height_str)?;
Ok(Frame { width, height })
}
fn main() {
println!("{:?}", parse_args());
}WidthTooSmall(u32),
HeightTooSmall(u32),if width < 2 {
return Err(WidthTooSmall(width));
}
if height < 2 {
return Err(HeightTooSmall(height));
}fn main () -> Result<(), self::parse_args::ParseError> {
let frame = parse_args::parse_args()?;
let mut game = Game::new(frame);
let sleep_duration = std::time::Duration::from_millis(33);
loop {
println!("{}", game);
game.step();
std::thread::sleep(sleep_duration);
}
}