如何打印Vec?

时间:2015-05-19 08:09:53

标签: rust println

我尝试了以下代码:

fn main() {
    let v2 = vec![1; 10];
    println!("{}", v2);
}

但是编译器抱怨道:

error[E0277]: `std::vec::Vec<{integer}>` doesn't implement `std::fmt::Display`
 --> src/main.rs:3:20
  |
3 |     println!("{}", v2);
  |                    ^^ `std::vec::Vec<{integer}>` cannot be formatted with the default formatter
  |
  = help: the trait `std::fmt::Display` is not implemented for `std::vec::Vec<{integer}>`
  = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
  = note: required by `std::fmt::Display::fmt`

是否有人为Vec<T>实现此特性?

5 个答案:

答案 0 :(得分:53)

let v2 = vec![1; 10];
println!("{:?}", v2);

{}用于字符串和其他值,可以直接显示给用户。没有一种方法可以向用户显示矢量。

{:?}格式化程序可用于调试它,它看起来像:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

Display是提供{}背后方法的特征,而Debug{:?}

答案 1 :(得分:38)

  

是否有人为stream.Position实现此特性?

没有

令人惊讶的是,这是一个明确正确的答案;这是罕见的,因为证明没有东西通常很难或不可能。那么我们怎么能这么肯定呢?

Rust具有非常严格的一致性规则,Vec<T>只能完成:

  • impl Trait for Struct
  • 位于同一个箱子中
  • 或与Trait
  • 位于同一个箱子中

而在其他任何地方;我是try it

Struct

的产率:

impl<T> std::fmt::Display for Vec<T> {
    fn fmt(&self, _: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
        Ok(())
    }
}

此外,要使用特征,它需要在范围内(因此,您需要链接到其条件箱),这意味着:

  • 您与error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`) --> src/main.rs:1:1 | 1 | impl<T> std::fmt::Display for Vec<T> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type | = note: only traits defined in the current crate can be implemented for a type parameter 的箱子和Display
  • 的箱子相关联
  • 既没有为Vec
  • 实施Display

因此我们得出结论,没有人为Vec实施Display

正如Manishearth所指出的那样,你可以使用Vec特征,它可以通过Debug作为格式说明符调用。

答案 2 :(得分:16)

如果您知道向量包含的元素的类型,您可以创建一个以向量作为参数的结构,并为该结构实现Display

use std::fmt::{Display, Formatter, Error};

struct NumVec(Vec<u32>);

impl Display for NumVec {
    fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
        let mut comma_separated = String::new();

        for num in &self.0[0..self.0.len() - 1] {
            comma_separated.push_str(&num.to_string());
            comma_separated.push_str(", ");
        }

        comma_separated.push_str(&self.0[self.0.len() - 1].to_string());
        write!(f, "{}", comma_separated)
    }
}

fn main() {
    let numbers = NumVec(vec![1; 10]);
    println!("{}", numbers);
}

答案 3 :(得分:4)

这是一个单行,也应该适合你:

println!("[{}]", v2.iter().fold(String::new(), |acc, &num| acc + &num.to_string() + ", "));

Here是 一个可运行的例子。

就我个人而言,我从函数调用中收到Vec<&str>。我不想将函数签名更改为自定义类型(我可以为其实现Display特征)。

对于我的一个案例,我能够将我的Vec的显示变成我与println!()直接使用的单行,如下所示:

println!("{}", myStrVec.iter().fold(String::new(), |acc, &arg| acc + arg));

(lambda可以适用于不同的数据类型,或者用于更简洁的Display特征实现。)

答案 4 :(得分:-1)

Does anyone implement this trait for Vec<T>?

是的,这是我的做法

fn main() {
    let a = vec![10,12,13];
    println!("{:?}",display(a));
}


use std::fmt::Debug;
fn display<T: Debug>(a: Vec<T>) -> Vec<T> {
    let mut new_vec : Vec<T> = Vec::new();
    
    for i in a {
        new_vec.push(i);
    }
    return new_vec
}