不幸的是,Rust关于where
的文档非常缺乏。该关键字仅出现在参考文献中的一个或两个不相关的示例中。
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
}
在CharEq特性的实现中,似乎where
被用作某种&#34;选择器&#34;为任何匹配某种闭包类型的东西实现Trait。我是对的吗?
有什么办法可以让where
得到更好,更完整的图片吗? (完整的使用和语法规范)
答案 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