得到错误"特征`std :: ops :: FnMut<(char,)>`没有实现`std :: string :: String`"对于简单类型不匹配

时间:2017-08-05 01:56:35

标签: rust

    let mystring = format!("the quick brown {}", "fox...");
    assert!(mystring.ends_with(mystring));

错误:

the trait `std::ops::FnMut<(char,)>` is not implemented for `std::string::String`

mystring.ends_with(mystring)更改为mystring.ends_with(mystring.as_str())可以解决问题。

为什么这个错误如此神秘?

如果我在不使用格式的情况下创建字符串,请说:

let mystring = String::from_str("The quick brown fox...");
assert!(mystring.ends_with(mystring));

错误更容易理解:

error[E0599]: no method named `ends_with` found for type
`std::result::Result<std::string::String, std::string::ParseError>`
in the current scope

1 个答案:

答案 0 :(得分:7)

还有更多错误:

| assert!(mystring.ends_with(mystring));
|                  ^^^^^^^^^ 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`

临界

  

注意:因std::str::pattern::Pattern<'_>

std::string::String的impl要求而需要

String's .ends_with接受任何实现Pattern特征的值作为其搜索模式,String不实现该特征。

如果查看the documentation for Pattern,则包括

impl<'a, 'b> Pattern<'a> for &'b String

因此,如果您更改

,则您的代码段正常工作
assert!(mystring.ends_with(mystring));

assert!(mystring.ends_with(&mystring));

这也很有意义,因为否则您会尝试将mystring所有权传递给ends_with函数,这似乎不对。

至于您看到的具体错误,Pattern的特质定义还包括

impl<'a, F> Pattern<'a> for F 
where
    F: FnMut(char) -> bool, 

通常表示函数接受char并将布尔计数作为模式返回,导致消息String与该特征实现不匹配。