2

我正在尝试解析一个简单的配置文本文件,该文件每行包含一个三个单词的条目,布局如下:

ITEM name value
ITEM name value
//etc.

我在这里(以及在 Rust Playpen 上)复制了执行解析(以及随后的编译错误)的函数:

pub fn parse(path: &Path) -> config_struct {

    let file = File::open(&path).unwrap();
    let reader = BufReader::new(&file);
    let line_iterator = reader.lines();
    let mut connection_map = HashMap::new();
    let mut target_map = HashMap::new();

    for line in line_iterator {

        let line_slice = line.unwrap();
        let word_vector: Vec<&str> = line_slice.split_whitespace().collect();

        if word_vector.len() != 3 { continue; }

        match word_vector[0] {
            "CONNECTION" => connection_map.insert(word_vector[1], word_vector[2]),
            "TARGET" => target_map.insert(word_vector[1], word_vector[2]),
            _ => continue,
        }
    }

    config_struct { connections: connection_map, targets: target_map }
}

pub struct config_struct<'a>  {
    // <name, value>
    connections: HashMap<&'a str, &'a str>,
    // <name, value>
    targets: HashMap<&'a str, &'a str>,
}


src/parse_conf_file.rs:23:3: 27:4 error: mismatched types:
 expected `()`,
    found `core::option::Option<&str>`
(expected (),
    found enum `core::option::Option`) [E0308]
src/parse_conf_file.rs:23 match word_vector[0] {
src/parse_conf_file.rs:24   "CONNECTION" => connection_map.insert(word_vector[1], word_vector[2]),
src/parse_conf_file.rs:25   "TARGET" => target_map.insert(word_vector[1], word_vector[2]),
src/parse_conf_file.rs:26   _ => continue,
src/parse_conf_file.rs:27 }

本质上,我似乎创建了一个match期望一个空元组的语句,并且还发现 a 的内容Vec<&str>被包裹在一个Option!

注意。这篇文章最初包含两个问题(我认为这是一个以不同方式表现出来的错误),但根据评论中的建议,我将其分成两个单独的帖子。后一篇文章在这里

4

1 回答 1

4

您最初的问题只是()循环体末尾有一个非表达式。您的match表达式具有类型Option<&str>(因为这是 的返回类型HashMap::insert),而不是 type ()。这个问题可以通过简单地在匹配表达式后面加一个分号来解决:

match word_vector[0] {
    "CONNECTION" => connection_map.insert(word_vector[1], word_vector[2]),
    "TARGET" => target_map.insert(word_vector[1], word_vector[2]),
    _ => continue,
};

对于后者,word_vector 不是填充了不指向 line_slice 的拥有对象吗?

不,这正是问题所在。word_vector包含 type 的元素&str,即借来的字符串。这些指向line_slice,它只存在到当前循环迭代结束。在将它们插入地图之前,您可能希望将它们转换为Strings (使用)。String::from

于 2015-07-24T23:19:54.323 回答