#![feature(unsized_locals)] pub trait Foo { fn foo(self) -> String; } struct A; impl Foo for A { fn foo(self) -> String { format!("hello") } } struct B(i32); impl Foo for B { fn foo(self) -> String { format!("{}", self.0) } } struct C(String); impl Foo for C { fn foo(self) -> String { self.0 } } struct D(Box); impl Foo for D { fn foo(self) -> String { *self.0 } } fn main() { let x = *(Box::new(A) as Box); assert_eq!(x.foo(), format!("hello")); let x = *(Box::new(B(42)) as Box); assert_eq!(x.foo(), format!("42")); let x = *(Box::new(C(format!("jumping fox"))) as Box); assert_eq!(x.foo(), format!("jumping fox")); let x = *(Box::new(D(Box::new(format!("lazy dog")))) as Box); assert_eq!(x.foo(), format!("lazy dog")); }