我正在尝试实现一个函数,它接受任何类型和任何长度的向量来打印它。
这是我现在的实施:
fn print_vec<T>(v: &T) {
for i in v.iter() {
println("{}",i);
}
}
fn main() {
let vec = [1,2,3];
print_vec(vec);
}
但是我收到以下错误:
mismatched types:
expected '&_'
found '[_; 3]'
答案 0 :(得分:11)
fn print_vec<T>(v: &T);
您的函数声明需要引用到项目,但您传入的项目([1,2,3]
)。让我们更改您的代码以传递参考:
print_vec(&vec);
您正在呼叫println
,但该宏名为println!
。
error: type `&T` does not implement any method in scope named `iter`
您有任何类型的引用,并非所有类型都实现方法iter
!例如,5.iter()
意味着什么?还是true.iter()
?因此,让我们将其更改为具有该方法的类型 - 切片:
fn print_vec<T>(v: &[T])
error: the trait `core::fmt::Display` is not implemented for the type `T`
我们已经说过我们想要一个切片,但切片中的项目可以是任何类型,并且并非所有类型都是可打印的!我们可以使用特征绑定将T
的类型限制为只能使用{}
格式化程序打印的内容:
fn print_vec<T>(v: &[T])
where T: std::fmt::Display
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);
}
let vec = [1, 2, 3];
您应不调用此变量vec
,因为不是Vec
。实际上,它是一个数组。在Rust中,数组,Vec
和切片都是截然不同的概念 - 我确信还有其他问题可以详细说明差异。
出于类似的原因,您不应该调用方法print_vec
,因为它现在接受切片。