首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`<T: Trait>`和‘`where : Trait`’之间有什么区别?

`<T: Trait>`和‘`where : Trait`’之间有什么区别?
EN

Stack Overflow用户
提问于 2017-10-17 15:12:25
回答 1查看 1.6K关注 0票数 14

医生们Send特性中,我看到了两者

代码语言:javascript
复制
impl<T> Send for LinkedList<T> 
where
    T: Send, 

代码语言:javascript
复制
impl<T: Send> Send for LinkedList<T>

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-17 15:22:30

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

添加where子句,它提供了一种更有表现力的方法来指定特征参数边界。..。现有的界表示法仍然是where子句的语法糖。下面列出了使用where语法克服的当前边界语法的限制:

  • --它不能表示除了类型参数以外的任何其他方面的界限。因此,如果在T中有一个通用函数,可以编写T:MyTrait来声明T必须实现MyTrait,但不能编写Option<T> : MyTrait(int, T) : MyTrait。这些表格并不常见,但仍然很重要。
  • --它不能很好地处理关联类型。--这是因为没有空间来指定关联类型的值。其他语言为此目的使用where子句(或类似的东西)。
  • --很难读懂。的经验表明,随着边界数量的增加,当前的语法变得难以阅读和格式化。

从那时起,您还可以在一个for <'a> ...子句中使用更高级别的特征界限( where ):

代码语言:javascript
复制
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的单一形状是值得的。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46793494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档