Question Comment convertir Vec en chaîne


Comment convertir Vec<char> à la forme de chaîne pour que je puisse l'imprimer?


32
2018-05-02 14:37


origine


Réponses:


Note de l'éditeur: Cette réponse était correcte pour les versions de Rust antérieures à la version 1.0, mais elle est maintenant obsolète (from_chars n'existe pas, et std::strbuf::StrBuf est maintenant juste String). D'autres réponses ont été mises à jour pour traiter Rust 1.0.

std::str::from_chars(char_vector.as_slice()); // creates a ~str

char_vector.iter().map(|c| *c).collect::<std::strbuf::StrBuf>();

Docs: std::str::from_chars

(Ce dernier peut être utilisé pour collecter ~str aussi, simplement en changeant la StrBuf tapez indice.)


3
2018-05-02 15:43



Utilisation collect() sur un itérateur:

let v = vec!['a', 'b', 'c', 'd'];
let s: String = v.into_iter().collect();
println!("{}", s);

Le vecteur d'origine sera consommé. Si vous avez besoin de le garder, utilisez v.iter():

let s: String = v.iter().collect();

Il n'y a pas de moyen plus direct parce que char est une valeur scalaire Unicode 32 bits, et les chaînes dans Rust sont des séquences d'octets (u8) représentant du texte en codage UTF-8. Ils ne correspondent pas directement aux séquences de chars.


65
2018-05-02 15:43



Voici une version plus lisible qui consomme le vecteur:

use std::iter::FromIterator;

fn main() {
    let v = vec!['a', 'b', 'c', 'd'];
    let s = String::from_iter(v);
    // vs
    let s: String = v.into_iter().collect();
}

Notez que collect est mis en œuvre avec un appel à FromIterator::from_iter:

fn collect<B: FromIterator<Self::Item>>(self) -> B
where
    Self: Sized,
{
    FromIterator::from_iter(self)
}

8
2018-05-18 18:39