Traits as a return value from a function, and explicit cast

casting, rust, traits

Solution

Yes, a trait object like that is the correct way to return a trait, although, if possible, returning a concrete type without a `Box` is more flexible: the callers of that function can box/cast if they need to. If that isn't directly possible, defining and returning an `enum` may work. (Boxing and trait objects should be regarded as somewhat of a last resort: it is often less efficient than other strategies.)

Unfortunately, implicit coercions don't yet infer from return values (they do in other contexts e.g. `foo(box bar)` will coerce that argument to a trait object if required); this will hopefully be fixed, but the explicit cast is required for now.

Problem

Exactly in the same way than this question, I would like that the return type of a function to be a trait, the return value being an instance of a type implementing that trait. A simple example: ``` fn myfunction() -> Box<Printable> { box TypeB{val: 2} as Box<Printable> } ``` If I don't explicitly cast into a box of my generic trait, I get: error: mismatched types: expected `Box<Printable>` but found `Box<TypeB>` (expected trait Printable but found struct TypeB) So I wonder: - If it is the normal way to proceed in Rust to return a trait type - Why the Rust compiler cannot infer that automatically downcast Any idea? I am using the current nightly version of the compiler.

Original source

Related problems