#[lang = "sized"] pub trait Sized {} #[lang = "clone"] pub trait Clone: Sized { fn clone(&self) -> Self; fn clone_from(&mut self, source: &Self) { *self = source.clone() } } mod impls { use super::Clone; macro_rules! impl_clone { ($($t:ty)*) => { $( impl Clone for $t { fn clone(&self) -> Self { *self } } )* } } impl_clone! { usize u8 u16 u32 u64 // u128 isize i8 i16 i32 i64 // i128 f32 f64 bool char } } #[lang = "copy"] pub trait Copy: Clone { // Empty. } mod copy_impls { use super::Copy; macro_rules! impl_copy { ($($t:ty)*) => { $( impl Copy for $t {} )* } } impl_copy! { usize u8 u16 u32 u64 // u128 isize i8 i16 i32 i64 // i128 f32 f64 bool char } } trait Foo where Self: Sized, { fn get(self) -> i32; fn test(self) -> i32 { self.get() } } struct Bar(i32); impl Foo for Bar { fn get(self) -> i32 { self.0 } } fn main() { let a; a = Bar(123); let b; b = Bar::get(a); let a; a = Bar(123); let b; b = a.test(); }