【问题标题】:What is the syntax and semantics of the `where` keyword?`where` 关键字的语法和语义是什么?
【发布时间】:2015-02-10 09:16:30
【问题描述】:

不幸的是,Rust 关于where 的文档非常缺乏。该关键字仅出现在参考文献中的一两个不相关示例中。

  1. where 在以下代码中有何语义差异?有什么区别吗?首选哪种形式?

    fn double_a<T>(a:T) -> T where T:std::num::Int {
        a+a
    }
    
    fn double_b<T: std::num::Int>(a:T) -> T {
        a+a
    }
    
  2. 在 CharEq trait 的实现中,where 似乎被用作某种“选择器”来为任何匹配某个闭包类型的事物实现 Trait。我说的对吗?

有什么方法可以让我更好、更完整地了解where? (完整的用法和语法规范)

【问题讨论】:

    标签: rust


    【解决方案1】:

    在您的示例中,这两个代码是严格等价的。

    引入了where 子句以允许更具表现力的边界检查,例如:

    fn foo<T>(a: T) where Bar<T>: MyTrait { /* ... */ }
    

    仅使用旧语法是不可能的。

    使用where而不是原始语法通常更便于阅读,即使仍然可以使用旧语法。

    你可以想象像这样的结构

    fn foo<A, B, C>(a: A, b: B, c: C)
        where A: SomeTrait + OtherTrait,
              B: ThirdTrait<A>+ OtherTrait,
              C: LastTrait<A, B>
    {
        /* stuff here */
    }
    

    这种方式更具可读性,即使仍然可以使用旧语法来表达。

    关于CharEq trait 的问题,代码是:

    impl<F> CharEq for F where F: FnMut(char) -> bool {
        #[inline]
        fn matches(&mut self, c: char) -> bool { (*self)(c) }
    
        #[inline]
        fn only_ascii(&self) -> bool { false }
    }
    

    它的字面意思是:为所有类型 F 实现 trait CharEq,它已经实现了 trait FnMut(char) -&gt; bool(即闭包或函数采用 char 并返回 bool)。

    有关更多详细信息,您可以查看引入 where 子句的 RFC:https://github.com/rust-lang/rfcs/pull/135

    【讨论】:

    • 同时存在 trait bound 和 where 子句的原因是 nikomatsakis “决定不这样做是为了避免破坏大量现有代码,并且因为现有语法在很多时候都很方便。”后一部分与“通常首选”相冲突,您有关于该偏好/编码风格的任何资料吗?
    • 来源...不,我没有。我主要是从我所看到的几乎所有地方都使用 where 子句来假设的。
    • 只是为了发泄一下,这个答案实际上是唯一一个你会知道多个 where 子句用逗号分隔的地方!官方书籍、官方语言参考和 rust by example 都对此保持沉默,仅提供单一绑定的示例!因此,在您找到与您要查找的内容相关的堆栈溢出答案之前,很容易在谷歌搜索中卡住。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多