| struct Foo { |
| inner: u32, |
| } |
| |
| struct Bar { |
| inner: u32, |
| } |
| |
| #[derive(Clone, Copy)] |
| struct Baz { |
| inner: u32, |
| } |
| |
| impl From<Baz> for Bar { |
| fn from(other: Baz) -> Self { |
| Self { |
| inner: other.inner, |
| } |
| } |
| } |
| |
| impl From<Baz> for Foo { |
| fn from(other: Baz) -> Self { |
| Self { |
| inner: other.inner, |
| } |
| } |
| } |
| |
| fn main() { |
| let x: Baz = Baz { inner: 42 }; |
| |
| // DOESN'T Compile: Multiple options! |
| let y = x.into(); //~ ERROR E0283 |
| |
| let y_1: Foo = x.into(); |
| let y_2: Bar = x.into(); |
| |
| let z_1 = Foo::from(y_1); |
| let z_2 = Bar::from(y_2); |
| |
| // No type annotations needed, the compiler KNOWS the type must be `Foo`! |
| let m = magic_foo(x); |
| } |
| |
| fn magic_foo(arg: Baz) -> Foo { |
| arg.into() |
| } |