在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