如何正确地将这个文件行向量传递给Rust中的函数?

如何正确地将这个文件行向量传递给Rust中的函数?,rust,Rust,我试着把一个文件读入一个向量,然后从这个向量中随机打印出一行 我做错了什么 我在这里问这个问题是因为我知道我在概念上犯了一个很大的错误,但我很难确定它到底在哪里 我知道错误- 错误[E0308]:类型不匹配 26 |处理器和线路 |^^^^^应为&str,找到结构std::string::string 我发现有一个不匹配的地方,但我不知道如何给出正确的类型,或者如何重构(非常短的)函数的代码 我的代码如下: use std::{ fs::File, io::{prelude::*

我试着把一个文件读入一个向量,然后从这个向量中随机打印出一行

我做错了什么

我在这里问这个问题是因为我知道我在概念上犯了一个很大的错误,但我很难确定它到底在哪里

我知道错误-

错误[E0308]:类型不匹配 26 |处理器和线路 |^^^^^应为
&str
,找到结构
std::string::string

我发现有一个不匹配的地方,但我不知道如何给出正确的类型,或者如何重构(非常短的)函数的代码

我的代码如下:

use std::{
    fs::File,
    io::{prelude::*, BufReader},
    path::Path,
};

fn lines_from_file(filename: impl AsRef<Path>) -> Vec<String> {
    let file = File::open(filename).expect("no such file");
    let buf = BufReader::new(file);
    buf.lines()
        .map(|l| l.expect("Could not parse line"))
        .collect()
}

fn processor(vectr: &Vec<&str>) -> () {
    let vec = vectr;
    let index = (rand::random::<f32>() * vec.len() as f32).floor() as usize;

    println!("{}", vectr[index]);
}

fn main() {
    let lines = lines_from_file("./example.txt");
    for line in lines {
        println!("{:?}", line);
    }
    processor(&lines);
}
使用std::{
fs::文件,
io::{前奏曲::*,布弗瑞德},
路径::路径,
};
fn行\u来自\u文件(文件名:impl AsRef)->Vec{
让file=file::open(filename).expect(“没有这样的文件”);
让buf=BufReader::new(文件);
buf.行()
.map(| l | l.expect(“无法分析行”))
.collect()
}
fn处理器(vectr:&Vec)->(){
设vec=vectr;
让index=(rand::random::()*vec.len()作为f32.floor()作为usize;
println!(“{}”,vectr[index]);
}
fn main(){
让lines=来自_文件(“./example.txt”)的行;
排队{
println!(“{:?}”,行);
}
处理器(&line);
}

当您调用
处理器
函数时,您试图传递一个
向量
,该向量是文件中的
行返回的,但
处理器
需要一个
向量
。您可以更改处理器以符合该期望:

fn processor(vectr: &Vec<String>) -> () {
    let vec = vectr;
    let index = (rand::random::<f32>() * vec.len() as f32).floor() as usize;

    println!("{}", vectr[index]);
}

更一般地说,
String
与String slice
&str
不同,因此
Vec
Vec
不同。我建议你检查一下防锈书:

谢谢!这就解释了。
fn main() {
    let lines = lines_from_file("./example.txt");
    for line in &lines {. //  &lines to avoid moving the variable
        println!("{:?}", line);
    }
    processor(&lines);
}