トレイト境界 サイズ未決定型を受け取れるようにする

トレイト境界はデフォルトでSized付けされる。 (Sized付けされるので、コンパイル時にサイズが決まっている必要がある)

NG

trait A {
    fn receive_from_b<T: B>(&self, b: &T);
}

trait B {
    fn send_a<T: A>(&self, a: T) {
        a.receive_from_b(self);
    }
}

/*
 error[E0277]: the size for values of type `Self` cannot be known at compilation time
 --> src/main.rs:7:26
  |
7 |         a.receive_from_b(self);
  |                          ^^^^ doesn't have a size known at compile-time
  |
help: consider further restricting `Self`
  |
6 |     fn send_a<T: A>(&self, a: T) where Self: Sized {
  |                                  ^^^^^^^^^^^^^^^^^
*/

?Sized をつけてサイズ未決定型にする必要がある。

trait A {
    fn receive_from_b<T: B + ?Sized>(&self, b: &T);
}