String :: contains(String)给出“特征绑定字符串:FnMut<(char,)>`不满足”

时间:2018-06-03 08:17:29

标签: string rust contains

以下代码尝试检查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`

1 个答案:

答案 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 :(

所以而不是传递Stringb),只需传递&String&b

if a.contains(&b) { ... }
//            ^