РЕДАКТИРОВАТЬ 2:
Поскольку вы обновили вопрос с помощью MCVE и заявили, что вам не нужно отказываться от примеров из книги ... вот еще одна версия, основанная на дополнительных распределениях с использованием String
:
fn main() {
let a = search("Waldo", "where in\nthe world\nis Waldo?");
let b = search("waldo", "where in\nthe world\nis Waldo?");
let c = search_case_insensitive("waldo", "where in\nthe world\nis Waldo?");
println!("{:?}", a);
println!("{:?}", b);
println!("{:?}", c);
}
pub fn search<S>(query: S, contents: S) -> Vec<String> where S: Into<String> {
let query = query.into();
let mut results = Vec::new();
for line in contents.into().lines() {
if line.contains(&query) {
results.push(line.into());
}
}
results
}
pub fn search_case_insensitive<S>(query: S, contents: S) -> Vec<String> where S: Into<String> {
let query = query.into().to_lowercase();
let contents = contents.into().to_lowercase();
search(query, contents)
}
Вот он работает на детской площадке
EDIT:
Я понял, что никогда не давал тебе альтернативы. Вот что я, вероятно, сделал бы:
pub enum SearchOptions {
CaseSensitive,
CaseInsensitive
}
pub fn search<'a>(query: &str, contents: &'a str, options: SearchOptions) -> Vec<&'a str> {
let mut results = Vec::new();
for line in contents.lines() {
let check = match options {
SearchOptions::CaseSensitive => line.contains(query),
SearchOptions::CaseInsensitive => line.to_lowercase().contains(&query.to_lowercase()),
};
if check {
results.push(line);
}
}
results
}
Это примерно настолько, насколько вы могли бы "обмануть" его.
Оригинальный ответ:
Реальная проблема заключается в том, что вы пытаетесь передать contents
, когда он связан с временем жизни 'a
... но вы действительно хотите быть "нечувствительным к регистру" - это query
.
Это никак не связано с продолжительностью жизни 'a
точно так же, и поэтому ... работает:
pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
let query = query.to_lowercase();
search(&query, contents)
}
Вот она на детской площадке
Вам все равно придется дублировать логику, хотя ... потому что вам нужно сопоставить запрос в нижнем регистре со строкой в нижнем регистре ..., что продемонстрировано в примерах в книге:
if line.to_lowercase().contains(&query) {
// ^^^^^^^^^^^^^^ each LINE is converted to lowercase here in the insensitive search
results.push(line);
}
"Как мне перестать дублировать логику?" - Ну, во-первых, они не совсем одинаковые. Я думаю, что ваша попытка была не совсем такой, какой вы были в первую очередь (хотя я рад, что ее исправили).