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
是什么意思?
答案 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]”,具体取决于 从哪一侧进行搜索。
否则说:并非所有模式都允许双头搜索。字符允许但不能使用字符串。