use std::env::{args, Args};
use std::iter::Skip;
fn main() {
let args: Skip<Args> = args().skip(1);
for arg in args {
println!("{}", arg);
}
}
您可能已经注意到,我们不需要将 args 标记为可变的。 这是因为我们将 args 值移动到 for 循环中,这意味着在 main 函数中看不到 for 循环对其进行的任何变更。
当我们在该示例的上下文中调用 parse 时,类型推断告诉我们,width 和 height 结果必须为 u32,因为它们在 Frame 中用作字段。 Rust 能够根据所需的返回类型决定使用什么实现。 酷!
#[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);
}
}