为什么不能在`Split`上调用`next_back()`?

时间:2019-09-08 04:40:46

标签: rust

std::str::Split的文档说它实现了std::iter::DoubleEndedIterator,它应该具有next_back()来获取最后一个元素。

但是当我这样做

fn get_file_ext(file_name: &str) -> Option<String> {
  if let Some(ext) = file_name.split(".").next_back() {
    return Some(ext.to_owned());
  }
  None
}

我得到了错误

error[E0599]: no method named `next_back` found for type `std::str::Split<'_, &str>` in the current scope
   --> src/render.rs:194:43
    |
194 |   if let Some(ext) = file_name.split(".").next_back() {
    |                                           ^^^^^^^^^
    |
    = note: the method `next_back` exists but the following trait bounds were not satisfied:
            `std::str::Split<'_, &str> : std::iter::DoubleEndedIterator`

the following trait bounds were not satisfied是什么意思?

1 个答案:

答案 0 :(得分:4)

解决方案:

只需更换

file_name.split(".")

使用

file_name.split('.')

说明:

这是特征实现声明:

impl<'a, P> DoubleEndedIterator for Split<'a, P>
where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 

这里绑定的缺失特征是

<P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>,

此特征范围是为char的搜索者实现的,而不是&str的搜索者。

请参见https://doc.rust-lang.org/std/str/pattern/trait.DoubleEndedSearcher.html

  

char :: Searcher是DoubleEndedSearcher,因为搜索一个char   只需要一次看一次,其行为与   两端。

     

(&str):: Searcher不是DoubleEndedSearcher,因为模式“ aa”   干草堆中的“ aaa”匹配为“ [aa] a”还是“ a [aa]”,具体取决于   从哪一侧进行搜索。

否则说:并非所有模式都允许双头搜索。字符允许但不能使用字符串。