`where`关键字的语法和语义是什么?

时间:2015-02-09 08:33:50

标签: rust

不幸的是,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特性的实现中,似乎where被用作某种&#34;选择器&#34;为任何匹配某种闭包类型的东西实现Trait。我是对的吗?

  3. 有什么办法可以让where得到更好,更完整的图片吗? (完整的使用和语法规范)

1 个答案:

答案 0 :(得分:20)

在您的示例中,这两个代码严格相同。

引入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特征的问题,代码为:

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 }
}

字面意思是:为已经实现特征CharEq的所有类型F实现特征FnMut(char) -> bool(即,一个闭包或一个函数char和返回bool)。

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