目前为止,我们将负责解析命令行参数的逻辑从 main 提取到了 parse_config 函数中,这有助于我们看
清值 query 和 filename 是相互关联的并应该在代码中表现这种关系。接着我们增加了 Config 结构体来
描述 query 和 filename 的相关性,并能够从 parse_config 函数中将这些值的名称作为结构体字段名称
返回。
所以现在 parse_config 函数的目的是创建一个 Config 实例,我们可以将 parse_config 从一个普通函
数变为一个叫做 new 的与结构体关联的函数。做出这个改变使得代码更符合习惯:可以像标准库中的
String 调用 String:: new 来创建一个该类型的实例那样,将 parse_config 变为一个与 Config 关联的
new 函数。需要做出的修改:
use std::env;
use std::fs;
fn main() {
let args: Vec = env::args().collect();
let config = Config::new(&args);
println!(“Searching for {}”, config.query);
println!(“In file {}”, config.filename);
let contents = fs::read_to_string(config.filename)
.expect(“Something went wrong reading the file”);
println!(“With text:\n{}”, contents);
// --snip–
}
// --snip–
struct Config {
query: String,
filename: String,
}
impl Config {
fn new(args: &[String]) -> Config {
let query = args[1].clone();
let filename = args[2].clone();
Config { query, filename }
}
}
示例 12-7:将 parse_config 变为 Config::new
这里将 main 中调用 parse_config 的地方更新为调用 Config::new。我们将 parse_config 的名字改为
new 并将其移动到 impl 块中,这使得 new 函数与 Config 相关联。再次尝试编译并确保它可以工作。