Issue
From The Book, listing 13-29:
pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
contents
.lines()
.filter(|line| line.contains(query))
.collect()
}
After an explanation of the above, the reader is invited, "Feel free to make the same change to use iterator methods in the search_case_insensitive function as well." Don't mind if I do:
pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
contents
.lines()
.filter(|line| line.to_lowercase().contains(query.to_lowercase()))
.collect()
}
Nope:
error[E0277]: expected a `FnMut<(char,)>` closure, found `String`
--> src/lib.rs:59:53
|
59 | .filter(|line| line.to_lowercase().contains(query.to_lowercase()))
| -------- ^^^^^^^^^^^^^^^^^^^^ expected an implementor of trait `Pattern<'_>`
| |
| required by a bound introduced by this call
|
= note: the trait bound `String: Pattern<'_>` is not satisfied
= note: required because of the requirements on the impl of `Pattern<'_>` for `String`
note: required by a bound in `core::str::<impl str>::contains`
help: consider borrowing here
|
59 | .filter(|line| line.to_lowercase().contains(&query.to_lowercase()))
| +
Indeed, this compiles and passes the tests from the earlier examples:
pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
contents
.lines()
.filter(|line| line.to_lowercase().contains(&query.to_lowercase()))
.collect()
}
For that matter, search will compile and pass if query is borrowed:
pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
contents
.lines()
.filter(|line| line.contains(&query))
.collect()
}
So why must query be borrowed in search_case_insensitive but its being a reference (or not) makes no difference to search?
Solution
The method str::contains() takes as a predicate generic P: Pattern. The Pattern trait is implemented for char, &char, &String, &[char], &str, &&str, [char; N], &[char; N] and F where F: FnMut(char) -> bool. All of those can be passed to contains(). However, it is not implemented for String. So in search(), you pass &str. That's fine. If you borrow it, you pass &&str, which is also fine. But in search_case_insensitive(), if you borrow you pass &String and that's fine, but if you don't, you pass String which does not implement the Pattern trait.
Answered By - Chayim Friedman Answer Checked By - Terry (PHPFixing Volunteer)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.