我已经熟悉了Rust泛型,但我不知道出了什么问题。
use std::collections::BTreeMap;
fn frequency<T: Ord + Clone>(vec: &Vec<T>) -> BTreeMap<T, u32> {
let mut movie_reviews = BTreeMap::new();
let mut vec_ = Vec::new();
vec.push(1);
movie_reviews
}
我不知道为什么它需要类型T
:
error[E0308]: mismatched types
--> src/lib.rs:6:14
|
6 | vec.push(1);
| ^ expected type parameter, found integral variable
|
= note: expected type `T`
found type `{integer}`
我不知道为什么它需要类型
T
它需要一个类型为T
的值,因为您正试图将一个值推送到Vec<T>
中。
问题是,你给编译器的关于T
的唯一信息是它是Ord + Clone
,但这两个特征都不表明1
是T
的值。num
板条箱中有一种称为One
的特性,它提供了以下特性:
extern crate num; // 0.2.0
use num::One;
use std::collections::BTreeMap;
fn frequency<T>(vec: &mut Vec<T>) -> BTreeMap<T, u32>
where
T: Ord + Clone + One,
{
let mut movie_reviews = BTreeMap::new();
vec.push(T::one());
movie_reviews
}
正如其他人所评论的,您的代码还有一两个其他问题,我不会在这里解决,因为这将修复您询问的错误。
在您的代码中,您有两个类似名称的变量vec
,它们来自函数定义,是对Vec<T>
(带有T: Ord+Clone
(的不可变引用,而vec_
是Vec<_>
(我在这里放了一个_
,以表明您让编译器推断类型(
你不能在vec
中推送1
:首先你只有一个对它的免疫引用,推送需要一个可变的引用,其次vec
是T
的Vec
,在这种情况下,它几乎可以是实现Ord
和Clone
的所有内容,编译器不能确保你能在其中推送一个整数。
然而,您可以在vec_
中推送1
,编译器将推断其类型为整数的Vec