Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 996
Fabimaru Avatar asked Nov 01 '22 21:11

Fabimaru


1 Answers

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.

like image 199
huon Avatar answered Nov 10 '22 03:11

huon