2

次のようにレイアウトされた、1 行に 1 つの 3 単語のエントリを含む単純な構成テキスト ファイルを解析しようとしています。

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

注意。この投稿にはもともと 2 つの質問が含まれていました (1 つのエラーが別の方法で現れると私は信じていました) が、コメントのアドバイスに従って、2 つの個別の投稿に分割しました。後者の投稿はこちら.

4

1 に答える 1

4

元の問題は()、ループ本体の最後に式がないことです。match式には typeではなく typeがありますOption<&str>(これは の戻り値の型であるため) 。この問題は、マッチ式の後にセミコロンを置くだけで解決されます。HashMap::insert()

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_vectortype の要素&str、つまり借用文字列を含みます。これらline_sliceは、現在のループ反復の最後まで存続する を指します。それらをマップに挿入する前に、String( を使用して) それらを sに変換することをお勧めします。String::from

于 2015-07-24T23:19:54.323 に答える