以下代码尝试检查String
是否包含其他String
。使用String::contains
方法时出现编译器错误。我希望String::contains(String)
可以直接使用。
当正在搜索的模式不是字符串文字时,在Rust中执行此操作的正确方法是什么?我做了rustc --explain E0277
,似乎String
没有实现Pattern
特征,这是真的吗?
fn main() {
let a = String::from("abcdefgh");
let b = String::from("def");
if a.contains(b) {
println!("Contained");
} else {
println!("Not contained");
}
}
编译错误:
error[E0277]: the trait bound `std::string::String: std::ops::FnMut<(char,)>` is not satisfied
--> src/main.rs:6:10
|
6 | if a.contains(b) {
| ^^^^^^^^ the trait `std::ops::FnMut<(char,)>` is not implemented for `std::string::String`
|
= note: required because of the requirements on the impl of `std::str::pattern::Pattern<'_>` for `std::string::String`
答案 0 :(得分:1)
让我们检查str::contains
的方法签名:
pub fn contains<'a, P>(&'a self, pat: P) -> bool
where
P: Pattern<'a>,
所以第二个参数必须是实现Pattern
的东西,正如您已经注意到的那样。我们可以通过访问the documentation of Pattern
找出实现该特征的人。在那里我们可以找到这些动词:
impl<'a, 'b> Pattern<'a> for &'b str
impl<'a> Pattern<'a> for char
impl<'a, 'b> Pattern<'a> for &'b [char]
impl<'a, F> Pattern<'a> for F
where
F: FnMut(char) -> bool,
impl<'a, 'b, 'c> Pattern<'a> for &'c &'b str
impl<'a, 'b> Pattern<'a> for &'b String
如您所见,该特征未直接针对String
实施。但已为&String
和&str
实施。这是有道理的:只需要读取模式,因此不需要String
的所有权。
在您的示例中,之后您将无法使用b
,因为它已被移入方法中:
let a: String = String::from("abcdefgh");
let b: String = String::from("def");
a.contains(b);
// If this would work, `b` couldn't be used anymore because it has been moved :(
所以而不是传递String
(b
),只需传递&String
(&b
):
if a.contains(&b) { ... }
// ^