繁体   English   中英

为什么要求AddAssign作为超级特征的特征也要求它是大小的?

[英]Why does a trait requiring AddAssign as a supertrait also require it to be Sized?

我有一个特点,为了实现这个特性,我想要求实现者实现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添加到特征边界,一切都很好,但是......为什么需要这样做? 为什么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大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM