如何实现打印任何类型和长度的矢量的函数?

TM9*_*M90 2 rust

我正在尝试实现一个函数,它采用任何类型和任何长度的向量来打印它.

这是我现在的实施:

fn print_vec<T>(v: &T) {
    for i in v.iter() {
        println("{}",i);
    }
}

fn main() {
    let vec = [1,2,3];
    print_vec(vec);
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

mismatched types:
expected '&_'
found '[_; 3]'
Run Code Online (Sandbox Code Playgroud)

She*_*ter 11

问题1

fn print_vec<T>(v: &T);
Run Code Online (Sandbox Code Playgroud)

您的函数声明需要对项目的引用,但您传入的是item([1,2,3]).让我们更改您的代码以传递参考:

print_vec(&vec);
Run Code Online (Sandbox Code Playgroud)

问题2

你正在呼叫println,但宏被调用println!.

问题3

error: type `&T` does not implement any method in scope named `iter`
Run Code Online (Sandbox Code Playgroud)

您有任何类型的引用,并非所有类型都实现该方法iter!例如,5.iter()意味着什么?还是true.iter()?所以,让我们将它改为具有该方法的类型 - 切片:

fn print_vec<T>(v: &[T])
Run Code Online (Sandbox Code Playgroud)

问题4

error: the trait `core::fmt::Display` is not implemented for the type `T`
Run Code Online (Sandbox Code Playgroud)

我们已经说过我们想要一个切片,但切片中的项目可以是任何类型,并非所有类型都是可打印的!我们可以使用一个特性绑定来限制T只能使用{}格式化程序打印的东西的类型:

fn print_vec<T>(v: &[T])
    where T: std::fmt::Display
Run Code Online (Sandbox Code Playgroud)

全部一起

fn print_vec<T>(v: &[T])
    where T: std::fmt::Display
{
    for i in v.iter() {
        println!("{}", i);
    }
}

fn main() {
    let vec = [1, 2, 3];
    print_vec(&vec);
} 
Run Code Online (Sandbox Code Playgroud)

额外的说明

let vec = [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

你应该叫这个变量vec,因为它不是一个Vec.实际上,它是一个数组.在Rust中,数组,Vecs和切片都是不同的概念 - 我确信还有其他问题可以详细说明差异.

出于类似的原因,您不应该调用该方法print_vec,因为它现在接受切片.