Почему черта, требующая AddAssign в качестве супертрейта, также требует его размера? - PullRequest
0 голосов
/ 04 июня 2018

У меня есть черта, и для ее реализации я бы хотел, чтобы разработчик реализовал AddAssign;однако в результате этого моя черта, по-видимому, нуждается в Sized:

trait Foo: ::std::ops::AddAssign {}

trait Bar: Iterator {}

(детская площадка)

Bar компилируется нормально;Foo, однако:

error[E0277]: the trait bound `Self: std::marker::Sized` is not satisfied
 --> src/main.rs:1:1
  |
1 | trait Foo: ::std::ops::AddAssign {}
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Self` does not have a constant size known at compile-time
  |
  = help: the trait `std::marker::Sized` is not implemented for `Self`
  = help: consider adding a `where Self: std::marker::Sized` bound
  = note: required by `std::ops::AddAssign`

Если я добавлю + Sized к границам черты, все в порядке, но ... зачем I нужно это делать?Почему AddAssign это не нужно?

1 Ответ

0 голосов
/ 04 июня 2018

Давайте посмотрим на определение черты:

pub trait AddAssign<Rhs = Self> {
    fn add_assign(&mut self, rhs: Rhs);
}

То есть trait Foo: ::std::ops::AddAssign эквивалентно trait Foo: ::std::ops::AddAssign<Foo>, а add_assign принимает Rhs в качестве второго параметра, следовательно, Rhs должен иметь размер.

Обратите внимание, что trait Foo: ::std::ops::AddAssign<u32> не требует Foo размера.

...