Estoy tratando de crear rápidamente un VecDeque usando ::from(). Tengo el siguiente código de Rust:

use std::collections::VecDeque;

fn main() {
    let ring = VecDeque::from([1, 2, 3]);
    println!("{:?}", ring);
}

Me sale el siguiente error del compilador:

error[E0277]: the trait bound `std::collections::VecDeque<_>: std::convert::From<[{integer}; 3]>` is not satisfied
 --> src/main.rs:4:16
  |
4 |     let ring = VecDeque::from([1, 2, 3]);
  |                ^^^^^^^^^^^^^^ the trait `std::convert::From<[{integer}; 3]>` is not implemented for `std::collections::VecDeque<_>`
  |
  = help: the following implementations were found:
            <std::collections::VecDeque<T> as std::convert::From<std::vec::Vec<T>>>
  = note: required by `std::convert::From::from`

Parece que la colección VecDeque no implementa el rasgo from, pero los documentos sugieren que sí. ¿Qué estoy haciendo mal?

5
Simon Brahan 23 feb. 2018 a las 16:21

2 respuestas

La mejor respuesta
use std::collections::VecDeque;
use std::iter::FromIterator;
fn main() {
    let ring = VecDeque::from_iter(&[1, 2, 3]);
    println!("{:?}", ring);
}

Solo implementa From<Vec<T>> y [...] no es un Vec. Dado que implementa FromIterator, puede usar cualquier tipo de iterador como fuente con from_iter. &[1, 2, 3] es porque from_iter toma un Iterator.

4
Shepmaster 24 feb. 2018 a las 17:53

Alternativamente, también puede usar From<Vec<T>>:

fn from(other: Vec<T>) -> VecDeque<T>

Convierta un Vec<T> en un VecDeque<T>.

Esto evita la reasignación donde sea posible, pero las condiciones para ello son estrictas y están sujetas a cambios, por lo que no se debe confiar en ellas a menos que Vec<T> provenga de From<VecDeque<T>> y no se haya reasignado.

Ejemplo:

let vector: Vec<i32> = vec![0, 1, 2];
let vec_queue: VecDeque<i32> = VecDeque::from(vector);
4
trentcl 15 dic. 2019 a las 15:17