├── Cargo.toml ├── Cargo.lock └── src └── main.rs /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "sandbox-rust-blanket-implementations" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "sandbox-rust-blanket-implementations" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | fn main() { 6 | let some_str = "i am going to shout"; 7 | let shout = some_str.shout(); 8 | let some_string = String::from("i also shout"); 9 | let shout2 = some_string.shout(); 10 | println!("{} - {}", shout, shout2); 11 | } 12 | 13 | // we deine a trait we will use to "extend" the &str and String types 14 | pub trait SomeExtension { 15 | fn shout(&self) -> String; 16 | 17 | } 18 | 19 | 20 | // here, take our extension and implement it on any type which can be references as a str 21 | impl SomeExtension for T 22 | where 23 | T: AsRef, 24 | { 25 | fn shout(&self) -> String { 26 | let s = self.as_ref(); 27 | format!("{}!", s.to_uppercase()) 28 | } 29 | } 30 | --------------------------------------------------------------------------------