<T:Trait>与T:Trait之间的差异

tur*_*too 9 traits rust

在特质文档Send,我看到了两者

impl<T> Send for LinkedList<T> 
where
    T: Send, 
Run Code Online (Sandbox Code Playgroud)

impl<T: Send> Send for LinkedList<T>
Run Code Online (Sandbox Code Playgroud)

这两种语法有什么区别,如果我impl为自己的特性编写声明,它会如何影响我的代码呢?

She*_*ter 10

where子句中定义的特征边界是内联声明的特征边界的超集.内联样式存在于该where子句之前; 该where条款在RFC 135引入:

添加where子句,它提供了一种更具表现力的指定特征参数边界的方法.[...]现有的边界符号仍然是where条款的语法糖.

以下是使用where语法克服的当前边界语法的限制列表:

  • 除了类型参数之外,它不能表达任何边界.因此,如果你有一个泛型函数T,你可以编写 T:MyTrait声明T必须实现MyTrait,但你不能写Option<T> : MyTrait(int, T) : MyTrait.这些形式不太常见,但仍然很重要.

  • 它与相关类型不兼容.这是因为没有空间来指定关联类型的值.其他语言为此目的使用where子句(或类似的东西).

  • 这很难读懂.经验表明,随着边界数量的增加,当前语法变得难以阅读和格式化.

从那时起,您还可以在子句中使用排名较高的特征边界(for <'a> ...)where:

fn foo<T, U>()
where
    // higher-ranked trait bounds
    for<'a> T: SomethingElse<'a>,
    // Bound not directly on the generic type
    i32: From<U>,
    T: Iterator,
    // Bound on an associated type
    T::Item: Clone,
    // Just really long
    U: ReallyLong + AnotherReallyLong + WowReallyLong,
{}
Run Code Online (Sandbox Code Playgroud)

如果内联特征界限可以满足您的需求,那么对您的代码没有任何影响.如果您需要仅where启用的额外功能,则需要使用where.


我的个人风格是始终使用where表格.git diff添加新边界时,单个形状也更容易,这对我来说是值得的额外代码.

  • @MatthieuM.它是另一种方式 - "?大小"只能在线工作.我记得因为我也喜欢单一的风格(使用`where`)但它不适用于`?Sized` ... (3认同)
  • TBH这是我渴望Python禅的那些实例之一:)此外,历史上存在一些小的差异,我记得`?Sized`只能在`where`子句中使用一段时间. (2认同)