我正试着往上爬,直到生锈,而且我被一种通用类型的东西卡住了。您肯定知道10.1章(泛型数据类型)中的例子。我想要创建一个同时包含i32向量和char向量的向量。但不知何故我无法让它起作用。
fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {
let mut largest = list[0];
for &item in list.iter() {
if item > largest {
largest = item;
}
}
largest
}
fn main() {
let number_list = vec![34, 50, 25, 100, 65];
let result = largest(&number_list);
println!("The largest number is {}", result);
let char_list = vec!['y', 'm', 'a', 'q'];
let result = largest(&char_list);
println!("The largest char is {}", result);
}我现在要创建一个向量
let mut vecvec = Vec<Vec<T>>::new();
vecvec.push(number_list);
vecvec.push(char_list);不幸的是,它不起作用。我希望你有建议。提前谢谢。
发布于 2020-04-02 10:58:11
首先,“它不起作用”是没有帮助的。显然“不管用”,否则你就不会寻求帮助了。
第二,提供您实际使用的代码(在操场上)要比猜测“不工作的代码”应该在哪里进行要容易得多。
第三,
让mut = Vec::new();
T需要在某个地方定义,并且需要有意义的东西。
vecvec.push(number_list);vecvec.push(char_list);
Vec<T>意味着vec的所有元素都必须具有相同的类型。这里有一个Vec<i32>和一个Vec<char>。它们不是相同的类型,也不能与相同的类型相协调,因此它们不能放在同一个向量中:锈蚀不具有普遍存在的类型擦除或Java的“根类型”,您不能仅仅说您有“向量向量”,并在运行时填充空白。
这意味着您需要某种间接的方式来“隐藏”发散点,对于您想要的每种类型的vec,都需要一个带有变体的枚举:
enum Wrapper {
Numbers(Vec<i32>),
Chars(Vec<char>)
}或者你可以通过它来使用一个属性对象的特性。
发布于 2020-04-02 11:58:15
各位,下面是在答案的帮助下创建的代码。(万一有人想出了这样一个模糊的想法;)
fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {
let mut largest = list[0];
for &item in list.iter() {
if item > largest {
largest = item;
}
}
largest
}
enum Wrapper {
Numbers(Vec<i32>),
Chars(Vec<char>)
}
fn main() {
let mut number_list = vec![34, 50, 25, 100, 65];
let result = largest(&number_list);
println!("The largest number is {}", result);
let mut char_list = vec!['y', 'm', 'a', 'q'];
let result = largest(&char_list);
println!("The largest char is {}", result);
let mut vec: Vec<Wrapper> = Vec::new();
vec.push(Wrapper::Numbers(number_list));
vec.push(Wrapper::Chars(char_list));
for v in vec.iter() {
match v {
Wrapper::Numbers(o) =>{ println!("The largest is {}", largest(o))},
Wrapper::Chars(c) => println!("The largest is {}", largest(c))
}
}
}https://stackoverflow.com/questions/60989833
复制相似问题