我有一个特质,要实现该特质,我想要求实现者实现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_assign
将Rhs
作为其第二个参数,因此需要调整Rhs
的大小。请注意,
trait Foo: ::std::ops::AddAssign<u32>
不需要调整Foo
的大小。