Rust Generi c Vector - PullRequest
       7

Rust Generi c Vector

0 голосов
/ 02 апреля 2020

Я пытаюсь пробиться до ржавчины, и я застрял на чем-то с типами c. Конечно, вы знаете пример из главы 10.1 (Generi c Типы данных). Я хотел бы создать вектор, который содержит вектор 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);

, к сожалению, это не работает. Я надеюсь, что у вас есть совет. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Во-первых, "это не работает" никогда не помогает . Очевидно, что это «не работает», иначе вы бы не обращались за помощью.

Во-вторых, предоставить код, с которым вы фактически работаете (на игровой площадке), гораздо проще, чем угадывать, где код "который не работает" должен go.

В-третьих,

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

T должно быть определено где-то, и оно должно что-то, что имеет смысл.

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

Vec<T> означает, что все элементы ve c должны иметь одинаковый тип. Здесь у вас есть Vec<i32> и Vec<char>. Они не одного типа, и они не могут быть согласованы с одним и тем же типом, поэтому они не могут быть помещены в один и тот же вектор: Rust не имеет повсеместного стирания типа или типа "root". «à la Java, вы не можете просто сказать, что у вас есть вектор или векторы, и оставить их там с заполнением пробелов во время выполнения.

Это означает, что вам нужно какое-то косвенное указание, чтобы« скрыть » "Дивергенция, либо перечисление с вариантом для каждого типа ve c, который вы хотите:

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

, либо черта, с помощью которой вы можете использовать объект черты .

0 голосов
/ 02 апреля 2020

всем, вот код, который теперь был создан с помощью ответов. На случай, если кто-то придумает такую ​​неясную идею;)

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

    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...