在the docs,我看到两个差异之间<T: Trait>以及其中:为<code>Send</code>特质特质
impl<T> Send for LinkedList<T>
where
T: Send,
和
impl<T: Send> Send for LinkedList<T>
的是这两种语法之间的区别,以及如何将它的影响我的代码是否为我自己的特质写了impl
声明?
在the docs,我看到两个差异之间<T: Trait>以及其中:为<code>Send</code>特质特质
impl<T> Send for LinkedList<T>
where
T: Send,
和
impl<T: Send> Send for LinkedList<T>
的是这两种语法之间的区别,以及如何将它的影响我的代码是否为我自己的特质写了impl
声明?
在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
,这对我来说是值得的。
TBH这是我渴望获得Python的禅宗的那些实例之一:)另外,历史上存在一些小的差异,我记得'Sized'只能在where子句中使用一段时间。 –
@MatthieuM。这是另一种方式 - “大小”只能在线工作。我记得,因为我也喜欢单一的风格(使用'where'),但它不适用于'尺寸'... – Shepmaster