4

I have a struct MyStruct that implements the trait MyTrait.

How I can map Result<Box<MyStruct>> to get Result<Box<dyn MyTrait>> without passing to map() an explicit lambda with the return type?

The code

#[derive(Debug)]
struct MyStruct;

trait MyTrait {}

impl MyTrait for MyStruct {}

#[derive(Debug)]
struct MyError;

type Result<T> = std::result::Result<T, MyError>;

fn foo(_: &mut dyn MyTrait) {}

fn main() {
    let res: Result<MyStruct> = Ok(MyStruct {});
    let res: Result<Box<dyn MyTrait>> = res.map(Box::new);
    // let res: Result<Box<dyn MyTrait>> = res.map(|x| -> Box<dyn MyTrait> {
    //     Box::new(x) //too verbose
    // });
    foo(res.unwrap().as_mut());
}

causes the compile error

error[E0308]: mismatched types
  --> src/main.rs:17:41
   |
17 |     let res: Result<Box<dyn MyTrait>> = res.map(Box::new);
   |                                         ^^^^^^^^^^^^^^^^^ expected trait MyTrait, found struct `MyStruct`
   |
   = note: expected type `std::result::Result<std::boxed::Box<dyn MyTrait>, _>`
              found type `std::result::Result<std::boxed::Box<MyStruct>, _>`

Playground

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
NikBond
  • 743
  • 1
  • 5
  • 20

0 Answers0