2017-10-17 58 views

回答

8

where子句中定义的特征边界是内联声明的特征边界的超集。内联样式存在于where条款之前;所述where条款是introduced in RFC 135

添加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, 
{} 

如果你的需求可以通过内嵌特征界限被满足,那么对你的代码没有影响。如果您需要只有where启用的额外功率,则您需要使用where


我个人的风格是总是使用where形式。添加新边界时,单个形状也更容易到git diff,这对我来说是值得的。

+2

TBH这是我渴望获得Python的禅宗的那些实例之一:)另外,历史上存在一些小的差异,我记得'Sized'只能在where子句中使用一段时间。 –

+3

@MatthieuM。这是另一种方式 - “大小”只能在线工作。我记得,因为我也喜欢单一的风格(使用'where'),但它不适用于'尺寸'... – Shepmaster