Skip to content

Instantly share code, notes, and snippets.

@NebulaFox
Last active March 19, 2020 19:36
Show Gist options
  • Select an option

  • Save NebulaFox/2faa580ae76bd1e008a31ec2952b82cd to your computer and use it in GitHub Desktop.

Select an option

Save NebulaFox/2faa580ae76bd1e008a31ec2952b82cd to your computer and use it in GitHub Desktop.
trait magic
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