Как новичок в Rust, я работаю над проблемами Project Euler , чтобы помочь мне понять язык. Проблема 4 касается палиндромов, и я нашел два решения для создания вектора палиндромов, но я не уверен, как работает любой из них.
Я использую вектор строк, products
, который рассчитывается так:
let mut products = Vec::new();
for i in 100..500 {
for j in 500..1000 {
products.push((i * j).to_string());
}
}
Для фильтрации только тех продуктов, которые являются палиндромными, у меня есть два следующих решения:
Решение 1:
let palindromes: Vec<_> = products
.iter()
.filter(|&x| x == &x.chars().rev().collect::<String>())
.collect();
Решение 2:
let palindromes: Vec<_> = products
.iter()
.filter(|&x| *x == *x.chars().rev().collect::<String>())
.collect();
Они оба дают правильный результат, но я понятия не имею, почему!
В решении 1 мы сравниваем ссылку на строку со ссылкой на только что созданную строку?
В решении 2 мы разыменовываем ссылку на строку и сравниваем ее с новой строкой с разыменовкой?
Что я ожидал бы сделать:
let palindromes: Vec<_> = products
.iter()
.filter(|x| x == x.chars().rev().collect::<String>())
.collect();
Я надеюсь, что кто-нибудь сможет мне объяснить:
- В чем разница между моими двумя решениями и почему они оба работают?
- Почему я не могу просто использовать
x
без ссылки или разыменования его в функции фильтра?
Спасибо!