diff --git a/solutions/collections/String.md b/solutions/collections/String.md index ac0f259..e9a1d8b 100644 --- a/solutions/collections/String.md +++ b/solutions/collections/String.md @@ -136,4 +136,32 @@ fn main() { println!("Success!") } +``` + +7. +```rust +use std::mem; + +fn main() { + let story = String::from("Rust By Practice"); + + // Prevent automatically dropping the String's data + let mut story = mem::ManuallyDrop::new(story); + + let ptr = story.as_mut_ptr(); + let len = story.len(); + let capacity = story.capacity(); + + // story has nineteen bytes + assert_eq!(16, len); + + // We can re-build a String out of ptr, len, and capacity. This is all + // unsafe because we are responsible for making sure the components are + // valid: + let s = unsafe { String::from_raw_parts(ptr, len, capacity) }; + + assert_eq!(*story, s); + + println!("Success!") +} ``` \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md index c53ec43..f40dbc4 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -80,4 +80,5 @@ - [Pin and Unpin](async/pin-unpin.md) - [Stream](async/stream.md) -- [Stand Library todo](std/intro.md) \ No newline at end of file +- [Standard Library todo](std/intro.md) + - [String](std/String.md) \ No newline at end of file diff --git a/src/collections/string.md b/src/collections/string.md index aa16bd6..f65c736 100644 --- a/src/collections/string.md +++ b/src/collections/string.md @@ -172,7 +172,38 @@ fn main() { } ``` +7. 🌟🌟🌟 +```rust,editable + +// FILL in the blanks +use std::mem; + +fn main() { + let story = String::from("Rust By Practice"); + + // Prevent automatically dropping the String's data + let mut story = mem::ManuallyDrop::new(story); + + let ptr = story.__(); + let len = story.__(); + let capacity = story.__(); + + // story has nineteen bytes + assert_eq!(16, len); + + // We can re-build a String out of ptr, len, and capacity. This is all + // unsafe because we are responsible for making sure the components are + // valid: + let s = unsafe { String::from_raw_parts(ptr, len, capacity) }; + + assert_eq!(*story, s); + + println!("Success!") +} +``` ### Common methods +More exercises of String methods can be found [here](../std/String.md). +> You can find the solutions [here](https://github.com/sunface/rust-by-practice)(under the solutions path), but only use it when you need it \ No newline at end of file diff --git a/src/std/String.md b/src/std/String.md new file mode 100644 index 0000000..2c0923c --- /dev/null +++ b/src/std/String.md @@ -0,0 +1 @@ +# String