ファイルを分割した。
minigrepのファイルを分割した。
main.rs
extern crate minigrep; use std::env; use std::process; use minigrep::Config; fn main() { let args: Vec<String> = env::args().collect(); let config = Config::new(&args).unwrap_or_else(|err| { println!("Problem parsing arguments: {}", err); process::exit(1); }); println!("Searchng for {}", config.query); println!("In file {}", config.filename); if let Err(e) = minigrep::run(config) { println!("Application error: {}", e); process::exit(1); } }
lib.rs
use std::error::Error; use std::fs::File; use std::io::prelude::*: pub fn run(config: Config) -> Result<(), Box<Error>> { let mut f = File::open(config.filename)?; let mut contents = String::new(); f.read_to_string(&mut contents)?; println!("With text:\n{}", contents); Ok(()) } pub struct Config { query: String, filename: String, } impl Config { fn new(args: &[String]) -> Result<Config, &'static str> { if args.len() < 3 { return Err("not enough arguments"); } let query = args[1].clone(); let filename = args[2].clone(); Ok(Config { query, filename }) } }
引数の個数が違う場合はエラーを出すようにしたり、分割した関数や構造体を使いたいのでpubを付けてみたり、
clone関数でも引数の文字をコピーさせたり、process関数を使ってexitさせてみたりした。
関数の分割の際に勉強になる。
ろぐ
https://github.com/jacoloves/lab/commit/79d6f499dac3c573b41f46c1889b0105b0774520