Last active
March 19, 2020 19:36
-
-
Save NebulaFox/2faa580ae76bd1e008a31ec2952b82cd to your computer and use it in GitHub Desktop.
trait magic
This file contains hidden or 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 rand; // 0.7.3 | |
| use rand::Rng; | |
| fn make_a_string_with(string: &str) -> String { | |
| let mut s = String::new(); | |
| s.push_str(string); | |
| let mut rng = rand::thread_rng(); | |
| let r = rng.gen_range(0, 100); | |
| for _ in 0..r { | |
| s.push_str("!"); | |
| } | |
| s | |
| } | |
| fn make_a_string_with_ref<S>(string: S) -> String | |
| where | |
| S: AsRef<str>, | |
| { | |
| let mut s = String::new(); | |
| s.push_str(string.as_ref()); | |
| let mut rng = rand::thread_rng(); | |
| let r = rng.gen_range(0, 100); | |
| for _ in 0..r { | |
| s.push_str("!"); | |
| } | |
| s | |
| } | |
| fn make_a_string_with_into<S>(string: S) -> String | |
| where | |
| S: Into<String>, | |
| { | |
| let mut s = string.into(); | |
| let mut rng = rand::thread_rng(); | |
| let r = rng.gen_range(0, 100); | |
| for _ in 0..r { | |
| s.push_str("!"); | |
| } | |
| s | |
| } | |
| fn main() { | |
| let slice = "Hello World"; // &'static str | |
| let string = String::from(slice); // also slice.to_string() or slice.to_owned() | |
| let moved_r_string = string.clone(); | |
| let moved_i_string = string.clone(); | |
| let ref_string = &string; | |
| // how long is a piece of string | |
| // coercing into &str | |
| let s_literal = make_a_string_with("panic"); | |
| let s_slice = make_a_string_with(slice); | |
| let s_string = make_a_string_with(&string); // have to reference | |
| let s_ref_string = make_a_string_with(ref_string); | |
| // matching type with trait AsRef<str> | |
| let r_literal = make_a_string_with_ref("panic"); | |
| let r_slice = make_a_string_with_ref(slice); | |
| let r_string = make_a_string_with_ref(moved_r_string); // moves | |
| let r_ref_string = make_a_string_with_ref(ref_string); | |
| // matching type with trait Into<String> | |
| let i_literal = make_a_string_with_into("panic"); | |
| let i_slice = make_a_string_with_into(slice); | |
| let i_string = make_a_string_with_into(moved_i_string); // moves | |
| let i_ref_string = make_a_string_with_into(ref_string); | |
| let array:[(&str, String); 12] = [ | |
| ("panic", s_literal), | |
| (slice, s_slice), | |
| (&string, s_string), | |
| (ref_string, s_ref_string), | |
| ("panic", r_literal), | |
| (slice, r_slice), | |
| (&string, r_string), | |
| (ref_string, r_ref_string), | |
| ("panic", i_literal), | |
| (slice, i_slice), | |
| (&string, i_string), | |
| (ref_string, i_ref_string), | |
| ]; | |
| for (o, s) in array.iter() { | |
| println!("len: {}, orginal:{}, string: {}", s.len(), o, s) | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment