Решение на упр.07 задача 1 от Милен Хаджиев

Обратно към всички решения

Към профила на Милен Хаджиев

Резултати

  • 0 точки от тестове
  • 2 бонус точки
  • 2 точки общо
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)

Код

pub struct Map<I, F> {
iter: I,
f: F,
}
pub fn iter_map<I, F, U>(iter: I, f: F) -> Map<I, F>
where
I: Iterator,
F: Fn(I::Item) -> U,
{
Map { iter, f }
}
impl<I, F, U> Iterator for Map<I, F>
where
I: Iterator,
F: Fn(I::Item) -> U,
{
type Item = U;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(&self.f)
}
}
pub struct Filter<I, F> {
iter: I,
pred: F,
}
pub fn iter_filter<I, F>(iter: I, pred: F) -> Filter<I, F>
where
I: Iterator,
F: Fn(&I::Item) -> bool,
{
Filter { iter, pred }
}
impl<I, F> Iterator for Filter<I, F>
where
I: Iterator,
F: Fn(&I::Item) -> bool,
{
type Item = I::Item;
fn next(&mut self) -> Option<Self::Item> {
while let Some(item) = self.iter.next() {
if (self.pred)(&item) {
return Some(item);
}
}
None
}
}
pub struct FilterMap<I, F> {
iter: I,
f: F,
}
pub fn iter_filter_map<I, F, U>(iter: I, f: F) -> FilterMap<I, F>
where
I: Iterator,
F: Fn(I::Item) -> Option<U>,
{
FilterMap { iter, f }
}
// Типът е impl Iterator<Item = U>, защото иначе трябва да напишем супер
// объркващи нестнати типове:
// Map<Filter<Map<I, F>, fn(U) -> bool>, fn(U) -> U>
// fn iter_filter_map<I, F, U>(iter: I, func: F) -> impl Iterator<Item = U>
// where
// I: Iterator,
// F: Fn(I::Item) -> Option<U>,
// {
// let mapped = iter_map(iter, func);
//
// let filtered = iter_filter(mapped, |opt: &Option<U>| opt.is_some());
//
// iter_map(filtered, |opt: Option<U>| opt.unwrap())
//}
impl<I, F, U> Iterator for FilterMap<I, F>
where
I: Iterator,
F: Fn(I::Item) -> Option<U>,
{
type Item = U;
fn next(&mut self) -> Option<Self::Item> {
while let Some(item) = self.iter.next() {
if let Some(res) = (self.f)(item) {
return Some(res);
}
}
None
}
}
#[derive(Debug, PartialEq, Eq)]
pub struct FoundWord(pub String);

Очаква се да използваш структура FoundWord(&str) - затова решението ти не се компилира заедно с тестовете. Давам ти 2т. за другия тест, който не използва FoundWord.

pub fn get_num_list(text: &str) -> Result<Vec<i32>, FoundWord> {
let mut res = Vec::new();
for token in text.split_whitespace() {
match token.parse::<i32>() {
Ok(num) => res.push(num),
Err(_) => return Err(FoundWord(token.to_string())),
}
}
Ok(res)
}
pub fn get_sum(text: &str) -> i32 {
text.split_whitespace()
.filter_map(|t| t.parse::<i32>().ok())
.sum()
}
//pub fn get_sum(text: &str) -> i32 {
// iter_filter_map(text.split_whitespace(), |s| s.parse::<i32>().ok()).sum()
//}
//pub fn get_num_list(text: &str) -> Result<Vec<i32>, FoundWord> {
// iter_map(text.split_whitespace(), |s| {
// s.parse::<i32>()
// .map_err(|_| FoundWord(s.to_string()))
// })
// .collect()
//}

Лог от изпълнението

Updating crates.io index
     Locking 17 packages to latest compatible versions
   Compiling proc-macro2 v1.0.103
   Compiling quote v1.0.42
   Compiling unicode-ident v1.0.22
   Compiling futures-core v0.3.31
   Compiling futures-sink v0.3.31
   Compiling futures-channel v0.3.31
   Compiling futures-task v0.3.31
   Compiling futures-io v0.3.31
   Compiling syn v2.0.111
   Compiling pin-utils v0.1.0
   Compiling pin-project-lite v0.2.16
   Compiling memchr v2.7.6
   Compiling slab v0.4.11
   Compiling solution v0.1.0 (/tmp/d20251127-1757769-fo1y94/solution)
   Compiling futures-macro v0.3.31
   Compiling futures-util v0.3.31
   Compiling futures-executor v0.3.31
   Compiling futures v0.3.31
error[E0308]: mismatched types
  --> tests/solution_test.rs:40:50
   |
40 |     assert_eq!(get_num_list(text), Err(FoundWord("baba")));
   |                                        --------- ^^^^^^- help: try using a conversion method: `.to_string()`
   |                                        |         |
   |                                        |         expected `String`, found `&str`
   |                                        arguments to this struct are incorrect
   |
note: tuple struct defined here
  --> tests/../src/lib.rs:99:12
   |
99 | pub struct FoundWord(pub String);
   |            ^^^^^^^^^

For more information about this error, try `rustc --explain E0308`.
error: could not compile `solution` (test "solution_test") due to 1 previous error

История (1 версия и 1 коментар)

Милен качи първо решение на 26.11.2025 22:18 (преди 9 дена)