2016-12-08 3 views
12

Ein neues Rustacean wie ich mit Jonglieren diese Art kämpft: String, &str, Vec<u8>, &[u8].Idiomatic Transformationen für String & str, Vec <u8> und & [U8]

In der Zeit hoffe ich, eine Offenbarung zu haben und plötzlich zu bekommen, warum einige Bibliotheksanrufe das eine oder andere benutzen. Bis dahin brauche ich Hilfe, um jeden idiomatischen Übergang abzubilden.

Unter diesen Typen:

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

Ich glaube, ich diese herausgefunden haben, aber sind sie idiomatische?

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

Schließlich möchte ich eine vollständige Tabelle der Übergänge für diese Typen:

&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] 

Antwort

14

Von &str

  • &str -> String hat many equally valid methods: String::from(st), st.to_string(), st.to_owned().
    • Aber ich schlage vor, Sie bleiben mit einem von ihnen in einem einzigen Projekt. Der große Vorteil von String::from ist, dass Sie es als Argument für eine map Methode verwenden können. Anstatt x.map(|s| String::from(s)) können Sie oft x.map(String::from) verwenden.
  • &str ->&[u8] von st.as_bytes()
  • &str getan wird ->Vec<u8> ist eine Kombination aus &str -> &[u8] -> Vec<u8>, dh st.as_bytes().to_owned()

Von String

  • String -> &str sollte nur &s sein, wo Zwang ist verfügbar oder s.as_str() wo ist es nicht.
  • String -> &[u8] ist die gleiche wie &str -> &[u8]: s.as_bytes()
  • String -> Vec<u8> eine eigene Methode hat: s.into_bytes()

Von &[u8]

  • &[u8] -> Vec<u8> von u.to_owned()
  • &[u8] -> &str getan wird, nicht wirklich existieren, das wäre &[u8] -> Result<&str, Error> vorgesehen ist, über str::from_utf8(u)
  • &[u8] -> String ist die Kombination von &[u8] -> Result<&str, Error> -> Result<String, Error>

Von Vec<u8>

  • Vec<u8> -> &[u8] sollte nur &v sein, wo Zwang verfügbar ist, oder as_slice, wo es nicht ist.
  • Vec<u8> -> &str ist die gleiche wie Vec<u8> -> &[u8] -> Result<&str, Error> dh str::from_utf8(&v)
  • Vec<u8> -> String tatsächlich nicht existiert, dass Vec<u8> -> Result<String, Error> über String::from_utf8(v)

Coercion ist verfügbar, wenn das Ziel nicht generisch ist, sondern als &str oder &[u8] bzw.

explizit eingegeben
Verwandte Themen