Rust where关键字的语法和语义是什么?
不幸的是,Rust关于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
位置的文档非常缺乏。关键字仅出现在引用中的一个或两个不相关的示例中
在下面的代码中,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}
}
它字面上的意思是:对已经实现traitFnMut(char)->bool
的所有类型的F
实现traitCharEq
(也就是说,一个闭包或一个函数接受一个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 }
}