2014-05-02 15 views

Odpowiedz

2

Ta odpowiedź była poprawna, gdy została zapisana, ale jest już nieaktualna (from_chars nie istnieje, a std::strbuf::StrBuf jest teraz tylko String), więc nie ma potrzeby zgłaszania. Spójrz na odpowiedź Vladimira Matveva (i przegłosuj) poniżej.


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

(Te ostatnie mogą być wykorzystywane do zbierania na ~str też, po prostu zmieniając wskazówkę StrBuf typ.)

+2

Gdy odpowiedź nie jest aktualna, logiczne jest, aby ją głosować. Zaktualizuj swoją odpowiedź, aby przerwać głosowanie. – Stargateur

+3

Uaktualnienie odpowiedzi będzie wymagać uznania/głosów od Vladimira. – huon

+0

Możesz zaktualizować odpowiedź wskazując odpowiednie wersje Rusta. – courteouselk

57

Aktualizacja dla Rust 1,0

Bardzo proste, wystarczy użyć collect() na iteracyjnej:

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

Oryginalny wektor zostanie skonsumowane. Jeśli trzeba je zachować, należy v.iter().cloned():

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

Nie ma bardziej bezpośredni sposób, ponieważ char jest 32-bitowa wartość skalarna Unicode i ciągi w Rust są sekwencje bajtów (u8) reprezentujący tekst w UTF- 8 kodowania. Nie mapują bezpośrednio do sekwencji char s.

3

Tutaj jest bardziej czytelna wersja zużywa wektor:

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

Pamiętaj, że collect jest realizowany z wezwaniem do FromIterator::from_iter:

fn collect<B: FromIterator<Self::Item>>(self) -> B where Self: Sized { 
    FromIterator::from_iter(self) 
} 
Powiązane problemy