2016-12-08 16 views
12

Nowa Rustacean jak sam zmaga się z żonglowania te typy: String, &str, Vec<u8>, &[u8].idiomatyczne transformacje dla String & Str, Vec <u8> i & [U8]

Po jakimś czasie mam nadzieję na objawienie i nagle dowiaduję się, dlaczego niektóre wywołania biblioteki używają jednego lub drugiego. Do tego czasu potrzebuję pomocy w określeniu każdego przejścia idiomatycznego.

Biorąc pod uwagę te rodzaje:

let st: &str = ...; 
let s: String = ...; 
let u: &[u8] = ...; 
let v: Vec<u8> = ...; 

Myślę, że zorientowali się one, ale są idiomatyczne?

&str -> String String::from(st) 
&str -> &[u8]  st.as_bytes() 
String -> &str  s.as_str() 
&[u8] -> &str  str::from_utf8(u) 
Vec<u8> -> String String::from_utf8(v) 

Docelowo chcę pełną tabelę przejść dla tych typów:

&str -> String 
&str -> &[u8] 
&str -> Vec<u8> 
String -> &str 
String -> &[u8] 
String -> Vec<u8> 
&[u8] -> &str 
&[u8] -> String 
&[u8] -> Vec<u8> 
Vec<u8> -> &str 
Vec<u8> -> String 
Vec<u8> -> &[u8] 

Odpowiedz

14

Od &str

  • &str -> String ma many equally valid methods: String::from(st), st.to_string(), st.to_owned().
    • Ale proponuję trzymać się jednego z nich w ramach jednego projektu. Główną zaletą String::from jest to, że można go użyć jako argumentu do metody map. Dlatego zamiast x.map(|s| String::from(s)) często można użyć x.map(String::from).
  • &str ->&[u8] odbywa się poprzez st.as_bytes()
  • &str ->Vec<u8> jest kombinacją &str -> &[u8] -> Vec<u8>, tj st.as_bytes().to_owned()

Od String

  • String -> &str powinny być tylko &s gdzie przymus jest dostępna lub s.as_str() gdzie nie jest.
  • String -> &[u8] jest taka sama jak &str -> &[u8]: s.as_bytes()
  • String -> Vec<u8> ma niestandardową metodę: s.into_bytes()

Od &[u8]

  • &[u8] -> Vec<u8> jest wykonywana przez u.to_owned()
  • &[u8] -> &str faktycznie nie istnieje, to będzie &[u8] -> Result<&str, Error> Pod warunkiem, poprzez str::from_utf8(u)
  • &[u8] -> String jest kombinacją &[u8] -> Result<&str, Error> -> Result<String, Error>

Od Vec<u8>

  • Vec<u8> -> &[u8] powinien być po prostu &v, gdzie przymus jest dostępny, lub as_slice gdzie nie jest.
  • Vec<u8> -> &str jest taka sama jak Vec<u8> -> &[u8] -> Result<&str, Error> tj str::from_utf8(&v)
  • Vec<u8> -> String faktycznie nie istnieje, to byłoby Vec<u8> -> Result<String, Error> poprzez String::from_utf8(v)

Przymus jest dostępna, gdy cel nie jest nazwą rodzajową, ale wyraźnie wpisane jako &str lub &[u8] odpowiednio