我有一个特质,要实现该特质,我想要求实现者实现AddAssign;但是,这样做导致我的特征似乎需要Sized:

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

trait Bar: Iterator {}

(playground)
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添加到特征范围,一切都很好,但是……为什么我需要这样做?为什么AddAssign不需要这个?

最佳答案

让我们看一下特征的定义:

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

也就是说,trait Foo: ::std::ops::AddAssign等效于trait Foo: ::std::ops::AddAssign<Foo>,并且add_assignRhs作为其第二个参数,因此需要调整Rhs的大小。

请注意,trait Foo: ::std::ops::AddAssign<u32>不需要调整Foo的大小。

10-02 02:27