Vector 锈菌属载体<;向量<;T>&燃气轮机;

Vector 锈菌属载体<;向量<;T>&燃气轮机;,vector,rust,Vector,Rust,我正在努力使自己生锈,但我被一个通用类型的东西卡住了。 您肯定知道第10.1章(通用数据类型)中的示例。我想创建一个包含i32向量和char向量的向量。 但不知怎么的,我无法让它工作 fn largest<T: PartialOrd + Copy>(list: &[T]) -> T { let mut largest = list[0]; for &item in list.iter() { if item > large

我正在努力使自己生锈,但我被一个通用类型的东西卡住了。 您肯定知道第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);
}
fn最大(列表:&[T])->T{
让mut最大=列表[0];
对于list.iter()中的项目(&T){
如果项目>最大{
最大=项目;
}
}
最大的
}
fn main(){
让number_list=vec![34,50,25100,65];
让结果=最大值(&number\u列表);
println!(“最大的数字是{}”,结果);
让char_list=vec!['y','m','a','q'];
让结果=最大值(&char_列表);
println!(“最大的字符是{}”,result);
}
现在我想创建一个向量

let mut vecvec = Vec<Vec<T>>::new();
vecvec.push(number_list);
vecvec.push(char_list);
让mut-Vec=Vec::new();
矢量推送(数字列表);
矢量推送(字符列表);
不幸的是,它不起作用。我希望你有建议。 提前谢谢

首先,“它不起作用”从来没有用过。这显然“不起作用”,否则你就不会寻求帮助

第二,提供您实际使用的代码(在操场上)比猜测“不起作用”的代码应该放在哪里要容易得多

第三,

Vec
表示Vec的所有元素必须具有相同的类型。这里有一个
Vec
和一个
Vec
。它们不是同一类型,也不能与同一类型相协调,因此不能将它们放在同一个向量中:Rust没有无处不在的类型擦除或“根类型”,就像Java一样,你不能只说你有一个或多个向量,然后在运行时填充空白

这意味着您需要某种间接方式来“隐藏”分歧,或者是一个枚举,其中包含您想要的每种vec类型的变量:

enum包装器{
数字(Vec),
Chars(Vec)
}
或者是一个特征,通过它你可以使用一个特征对象。

首先,“它不起作用”是没有帮助的。这显然“不起作用”,否则你就不会寻求帮助

第二,提供您实际使用的代码(在操场上)比猜测“不起作用”的代码应该放在哪里要容易得多

第三,

Vec
表示Vec的所有元素必须具有相同的类型。这里有一个
Vec
和一个
Vec
。它们不是同一类型,也不能与同一类型相协调,因此不能将它们放在同一个向量中:Rust没有无处不在的类型擦除或“根类型”,就像Java一样,你不能只说你有一个或多个向量,然后在运行时填充空白

这意味着您需要某种间接方式来“隐藏”分歧,或者是一个枚举,其中包含您想要的每种vec类型的变量:

enum包装器{
数字(Vec),
Chars(Vec)
}
或者一个特征,通过它你可以使用一个特征对象。

每个人, 下面是在答案的帮助下创建的代码。万一有人想出这样一个模糊的主意;)

fn最大(列表:&[T])->T{
让mut最大=列表[0];
对于list.iter()中的项目(&T){
如果项目>最大{
最大=项目;
}
}
最大的
}
枚举包装器{
数字(Vec),
Chars(Vec)
}
fn main(){
让mut number_list=vec![34,50,25,100,65];
让结果=最大值(&number\u列表);
println!(“最大的数字是{}”,结果);
让mut char_list=vec!['y','m','a','q'];
让结果=最大值(&char_列表);
println!(“最大的字符是{}”,result);
让mut-vec:vec=vec::new();
向量推送(包装器::数字(数字列表));
向量推送(包装器::Chars(char_列表));
对于向量中的v.iter(){
比赛五{
包装器::number(o)=>{println!(“最大的是{}”,最大的(o))},
包装器::Chars(c)=>println!(“最大的是{}”,最大的(c))
}
}
}
各位, 下面是在答案的帮助下创建的代码。万一有人想出这样一个模糊的主意;)

fn最大(列表:&[T])->T{
让mut最大=列表[0];
对于list.iter()中的项目(&T){
如果项目>最大{
最大=项目;
}
}
最大的
}
枚举包装器{
数字(Vec),
Chars(Vec)
}
fn main(){
让mut number_list=vec![34,50,25,100,65];
让结果=最大值(&number\u列表);
println!(“最大的数字是{}”,结果);
让mut char_list=vec!['y','m','a','q'];
让结果=最大值(&char_列表);
println!(“最大的字符是{}”,result);
让mut-vec:vec=vec::new();
向量推送(包装器::数字(数字列表));
向量推送(包装器::Chars(char_列表));
对于向量中的v.iter(){
比赛五{
包装器::number(o)=>{println!(“最大的是{}”,最大的(o))},
包装器::Chars(c)=>println!(“最大的是{}”,最大的(c))
}
}
}

你好,马斯克林,感谢您的快速反馈。很抱歉,我的问题构造不正确,请在以后尝试改进我的问题。是的,我知道向量只能包含一种数据类型。但因为向量是一个堆数据类型,所以向量本身就是一个地址,至少我的理解是这样的。因此,我假设向量可以创建包含地址的数据类型。但是现在,在进一步阅读之后,我认为我必须把它放进一个盒子里。我说得对吗?再次感谢您的快速回答。保持健康。@DusanDjordjevic:在一种强类型语言中,比如Rust,说向量本身是地址不是一个好主意:向量是地址和类型(以及其他一些东西)。同样地,
不仅仅是一个地址,它是一个地址和类型。向量是一种类型和结构,它不仅仅是指向堆上某个随机区域的指针,该区域与堆上的任何其他区域等效。所以
let mut vecvec = Vec<Vec<T>>::new();
vecvec.push(number_list);
vecvec.push(char_list);
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))
        }

    }

}