如何将Vec <Vec <f64 >>转换为字符串

Man*_*gor 3 string vector rust

我是Rust的新手,我正在努力完成一项简单的任务.我想将矩阵转换为字符串,字段由制表符分隔.我认为这可以通过使用map函数或类似的东西,但现在无论我尝试什么给我一个错误.

这就是我所拥有的,我想将该col部分转换为函数,它返回一个制表符分隔的字符串,我可以打印它.在Python中,这就像是row.join("\t").Rust中有类似的东西吗?

fn print_matrix(vec: &Vec<Vec<f64>>) {
    for row in vec.iter() {
        for col in row.iter() {
           print!("\t{:?}",col);
        }
        println!("\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*odt 6

join标准库中确实有一个,但它并不是非常有用(通常需要额外的分配).但你可以在这里看到一个解决方案:

fn print_matrix(vec: &Vec<Vec<f64>>) {
    for row in vec {
        let cols_str: Vec<_> = row.iter().map(ToString::to_string).collect();
        let line = cols_str.join("\t");
        println!("{}", line);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是这join适用于切片而不是迭代器.我们必须首先将所有元素转换为字符串,将结果收集到新的向量中然后才能使用join.

crate itertools定义了join迭代器的方法,可以这样应用:

for row in vec {
    let line = row.iter().join("\t");
    println!("{}", line);
}
Run Code Online (Sandbox Code Playgroud)

并且为了避免使用任何命名功能,您当然可以手动执行:

for row in vec {
    if let Some(first) = row.get(0) {
        print!("{}", first);            
    }
    for col in row.iter().skip(1) {
        print!("\t{}", col);
    }
    println!("");
}
Run Code Online (Sandbox Code Playgroud)