Created
November 21, 2019 10:20
-
-
Save jimmychu0807/9a89355e642afad0d2aeda52e6ad2424 to your computer and use it in GitHub Desktop.
Conversion between String, str, Vec<u8>, Vec<char> in Rust
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::str; | |
fn main() { | |
// -- FROM: vec of chars -- | |
let src1: Vec<char> = vec!['j','{','"','i','m','m','y','"','}']; | |
// to String | |
let string1: String = src1.iter().collect::<String>(); | |
// to str | |
let str1: &str = &src1.iter().collect::<String>(); | |
// to vec of byte | |
let byte1: Vec<u8> = src1.iter().map(|c| *c as u8).collect::<Vec<_>>(); | |
println!("Vec<char>:{:?} | String:{:?}, str:{:?}, Vec<u8>:{:?}", src1, string1, str1, byte1); | |
// -- FROM: vec of bytes -- | |
// in rust, this is a slice | |
// b - byte, r - raw string, br - byte of raw string | |
let src2: Vec<u8> = br#"e{"ddie"}"#.to_vec(); | |
// to String | |
// from_utf8 consume the vector of bytes | |
let string2: String = String::from_utf8(src2.clone()).unwrap(); | |
// to str | |
let str2: &str = str::from_utf8(&src2).unwrap(); | |
// to vec of chars | |
let char2: Vec<char> = src2.iter().map(|b| *b as char).collect::<Vec<_>>(); | |
println!("Vec<u8>:{:?} | String:{:?}, str:{:?}, Vec<char>:{:?}", src2, string2, str2, char2); | |
// -- FROM: String -- | |
let src3: String = String::from(r#"o{"livia"}"#); | |
let str3: &str = &src3; | |
let char3: Vec<char> = src3.chars().collect::<Vec<_>>(); | |
let byte3: Vec<u8> = src3.as_bytes().to_vec(); | |
println!("String:{:?} | str:{:?}, Vec<char>:{:?}, Vec<u8>:{:?}", src3, str3, char3, byte3); | |
// -- FROM: str -- | |
let src4: &str = r#"g{'race'}"#; | |
let string4 = String::from(src4); | |
let char4: Vec<char> = src4.chars().collect(); | |
let byte4: Vec<u8> = src4.as_bytes().to_vec(); | |
println!("str:{:?} | String:{:?}, Vec<char>:{:?}, Vec<u8>:{:?}", src4, string4, char4, byte4); | |
} |
Just found that an alternative way of converting String to Vec is this String::into_bytes()
.
pub fn into_bytes(self) -> Vec<u8, Global> ⓘ
Converts a String into a byte vector.
This consumes the String, so we do not need to copy its contents.
awesome, thanks!
@jimmychu0807 thank you my friend :)
Are you god?
Thanks, super useful collection of examples!
thank you dear sir !
let byte1: Vec = src1.iter().map(|c| *c as u8).collect::<Vec<_>>();
This won't work for multi-byte characters (like '你', '漢', '😊', 'م', 'Ω'
).
let byte1: Vec = src1.iter().map(|c| *c as u8).collect::<Vec<_>>();
This won't work for multi-byte characters (like
'你', '漢', '😊', 'م', 'Ω'
).
That's what I'm worrying about
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
My favourite about Rust would be transforming
String
usinglet char3: Vec<char> = src3.chars().collect::<Vec<_>>();
intoVec<char>
, it makes so much sense!