2017-10-17 36 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