Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust where关键字的语法和语义是什么?_Rust - Fatal编程技术网

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

Rust where关键字的语法和语义是什么?,rust,Rust,不幸的是,Rust关于位置的文档非常缺乏。关键字仅出现在引用中的一个或两个不相关的示例中 在下面的代码中,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 } fn double\u a(a:T)->T其中T:std::num::I

不幸的是,Rust关于
位置的文档非常缺乏。关键字仅出现在引用中的一个或两个不相关的示例中

  • 在下面的代码中,
    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
    }
    
    fn double\u a(a:T)->T其中T:std::num::Int{
    a+a
    }
    fn双_b(a:T)->T{
    a+a
    }
    
  • 在CharEq trait的实现中,
    where
    似乎被用作某种“选择器”,以实现任何与某个闭包类型匹配的trait。我说得对吗


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

    在您的示例中,这两个代码严格等效

    引入了
    where
    子句,以允许进行更具表现力的绑定检查,例如:

    fn foo<T>(a: T) where Bar<T>: MyTrait { /* ... */ }
    
    这种方式可读性更高,即使仍然可以使用旧语法表示

    关于
    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 }
    }
    
    impl CharEq for F,其中F:FnMut(char)->bool{
    #[内联]
    fn匹配(&mutself,c:char)->bool{(*self)(c)}
    #[内联]
    fn only_ascii(&self)->bool{false}
    }
    
    它字面上的意思是:对已经实现trait
    FnMut(char)->bool
    的所有类型的
    F
    实现trait
    CharEq
    (也就是说,一个闭包或一个函数接受一个
    char
    并返回一个
    bool


    有关更多详细信息,您可以查看引入
    where
    子句的RFC:

    trait bounds和where子句都存在的原因是nikomatsakis“决定反对这一点,以避免破坏大量现有代码,并且因为现有语法在大多数情况下都很方便。”后一部分与“一般来说是首选“,您有关于该首选项/编码样式的任何来源吗?来源。。。不,我没有。我主要是从我所看到的几乎所有地方都使用where子句来假设的。只是想发泄一下,这个答案实际上是唯一一个你会知道多个where子句是逗号分隔的地方!官方书籍、官方语言参考和rust by example都对此保持沉默,并且只提供了一个单独装订的示例!因此,在你找到与你所寻找的内容相关的堆栈溢出答案之前,很容易陷入谷歌搜索。
    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 }
    }