【问题标题】:Rust Generic Vector<Vector<T>>Rust 泛型向量<Vector<T>>
【发布时间】:2022-03-06 22:37:13
【问题描述】:

我正在努力尝试生锈,但我被泛型类型所困扰。 您肯定知道第 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);

不幸的是,它不起作用。我希望你有建议。 提前致谢。

【问题讨论】:

    标签: vector rust


    【解决方案1】:

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

    其次,提供您实际使用的代码(在操场上)比猜测“不工作”的代码应该去哪里要容易得多。

    第三,

    let mut vecvec = Vec<Vec<T>>::new();
    

    T 需要在某个地方定义,并且必须是有意义的。

    vecvec.push(number_list);
    vecvec.push(char_list);
    

    Vec&lt;T&gt; 表示 vec 的所有元素必须具有相同的类型。这里有一个Vec&lt;i32&gt; 和一个Vec&lt;char&gt;。它们不是同一种类型,并且它们不能调和到同一种类型,所以它们不能放在同一个向量中:Rust 没有无处不在的类型擦除或“根类型”就像 Java,你不能只说你有“一个向量的向量”,然后在运行时填充空白。

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

    enum Wrapper {
        Numbers(Vec<i32>),
        Chars(Vec<char>)
    }
    

    或者一个特征,然后你可以通过它使用一个特征对象

    【讨论】:

    • 您好 Masklinn,感谢您的快速反馈。抱歉,问题构造不正确,请尝试在将来改进我的问题。是的,我知道向量只能包含一种数据类型。但是由于向量是堆数据类型,所以向量本身就是一个地址,至少我的理解是这样。出于这个原因,我假设一个向量可以创建一个包含地址的数据类型。但是现在,经过进一步阅读,我认为我必须将其放入一个盒子中。我对吗?再次感谢您的快速回答。保持健康。
    • @DusanDjordjevic:在像 Rust 这样的强类型语言中,说向量本身就是一个地址并不是一个好主意:向量就是一个地址并且一个类型(以及其他一些东西)。同样,Box 不仅仅是一个地址,它是一个地址和一个类型。
    • 向量是一种类型和结构,它不仅仅是指向堆上某个随机区域的指针,它等同于堆上的任何其他区域。因此,不同具体类型的两个向量(具有不同Ts 的向量)本质上是不相关的,如果没有诸如枚举或特征对象之类的“兼容性层”,就不能混合。一个盒子本身不会做任何事情,你会有一个Box&lt;Vec&lt;i32&gt;&gt; 和一个Box&lt;Vec&lt;char&gt;&gt;,仍然不相关。充其量这将是一种创建盒装特征对象的方法。
    • “首先,“它不起作用”永远不会有帮助。显然它“不起作用”或者你不会寻求帮助。首先,这应该是问题下的评论。 “其次,提供你实际使用的代码(在操场上)比猜测“不工作”的代码应该去哪里要容易得多。”这也是
    【解决方案2】:

    大家, 这是现在在答案的帮助下创建的代码。万一有人想出这样一个晦涩难懂的想法;)

    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))
            }
    
        }
    
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多