rust - str 和 string 之间不匹配

标签 rust

我有这个小程序,但我无法让它运行。我遇到 &strString 之间的类型不匹配或类似错误。

这就是程序

use std::fs::File;
use std::io;
use std::io::prelude::*;
use std::io::BufReader;
use std::collections::HashMap;

fn main() {
    let mut f = File::open("/home/asti/class.csv").expect("Couldn't open file");
    let mut s = String::new();
    let reader = BufReader::new(f);
    let lines: Result<Vec<_>,_> = reader.lines().collect();


    let mut class_students: HashMap<String, Vec<String>> = HashMap::new();
    for l in lines.unwrap() {
        let mut str_vec: Vec<&str> = l.split(";").collect();
        println!("{}", str_vec[2]);
        let e = class_students.entry(str_vec[2]).or_insert(vec![]);
        e.push(str_vec[2]);
    }

    println!("{}", class_students);


}

我经常收到此错误:

hello_world.rs:20:38: 20:48 error: mismatched types:
 expected `collections::string::String`,
    found `&str`
(expected struct `collections::string::String`,
    found &-ptr) [E0308]
hello_world.rs:20         let e = class_students.entry(str_vec[2]).or_insert(vec![]);
                                                       ^~~~~~~~~~

我尝试更改线路

let mut str_vec: Vec<&str> = l.split(";").collect();

let mut str_vec: Vec<String> = l.split(";").collect();

但是我收到了这个错误:

hello_world.rs:16:53: 16:60 error: the trait `core::iter::FromIterator<&str>` is not implemented for the type `collections::vec::Vec<collections::string::String>` [E0277]
hello_world.rs:16         let mut str_vec: Vec<String> = l.split(";").collect();

那么如何从 l 而不是 &str 中提取 String 呢?另外,如果有更好的解决方案,请告诉我,因为我对这项技术的新手可能是众所周知的。

最佳答案

比评论更详细的答案:

您的示例最初无法编译的原因是您尝试将切片插入到字符串向量中。由于基本类型 str 实现了 ToString 特征,因此您可以调用 to_string() 方法将其转换为字符串,从而为您的向量提供正确的值类型。

另一个选项是to_owned(),如 this 中所示。线程。

关于rust - str 和 string 之间不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35732065/

相关文章:

rust - 是否可以在编译时从环境变量初始化变量?

python - 安装http-request-randomizer会导致安装错误

macros - 是否可以编写一个计算项目并生成枚举的宏?

rust - 使用 Rust 在 PATH 中查找可执行文件

rust - 如何使用 Rust 中的闭包创建迭代器?

rust - 如何为包含原始指针的结构强制执行生命周期?

json - 无法从json反序列化chrono::DateTime

arrays - 尽可能使用 `Iterator` 而不是 `Vec`?

rust - dyn A+B 可能吗?

rust - 在 Rust 中从 Option<Vec<Custom>> 生成 Option<Vec<String>>