// run-pass #![allow(dead_code)] use std::fmt::Display; struct ST1(i32, i32); impl ST1 { fn new() -> Self { ST1(0, 1) } fn ctor() -> Self { Self(1,2) // Self as a constructor } fn pattern(self) { match self { Self(x, y) => println!("{} {}", x, y), // Self as a pattern } } } struct ST2(T); // With type parameter impl ST2 where T: Display { fn ctor(v: T) -> Self { Self(v) } fn pattern(&self) { match self { Self(ref v) => println!("{}", v), } } } struct ST3<'a>(&'a i32); // With lifetime parameter impl<'a> ST3<'a> { fn ctor(v: &'a i32) -> Self { Self(v) } fn pattern(self) { let Self(ref v) = self; println!("{}", v); } } struct ST4(usize); impl ST4 { fn map(opt: Option) -> Option { opt.map(Self) // use `Self` as a function passed somewhere } } struct ST5; // unit struct impl ST5 { fn ctor() -> Self { Self // `Self` as a unit struct value } fn pattern(self) -> Self { match self { Self => Self, // `Self` as a unit struct value for matching } } } struct ST6(i32); type T = ST6; impl T { fn ctor() -> Self { ST6(1) } fn type_alias(self) { let Self(_x) = match self { Self(x) => Self(x) }; let _opt: Option = Some(0).map(Self); } } struct ST7(T1, T2); impl ST7 { fn ctor() -> Self { Self(1, 2) } fn pattern(self) -> Self { match self { Self(x, y) => Self(x, y), } } } fn main() { let v1 = ST1::ctor(); v1.pattern(); let v2 = ST2::ctor(10); v2.pattern(); let local = 42; let v3 = ST3::ctor(&local); v3.pattern(); let v4 = Some(1usize); let _ = ST4::map(v4); let v5 = ST5::ctor(); v5.pattern(); let v6 = ST6::ctor(); v6.type_alias(); let v7 = ST7::::ctor(); let r = v7.pattern(); println!("{} {}", r.0, r.1) }