упр.05 задача 1

Предадени решения

Краен срок:
12.11.2025 23:59
Точки:
1

Срокът за предаване на решения е отминал

// Include the solution source in the same file, so we
// don't have to worry about item visibility.
// Please don't use `include!` in real code, this is a hack
// around the checking system.
include!{ "../src/lib.rs" }
#[test]
fn test_basic() {
let bytes: Vec<u8> = my_collect("hello".bytes());
assert_eq!(bytes, vec![b'h', b'e', b'l', b'l', b'o']);
let chars: Vec<char> = my_collect("здравей".chars());
assert_eq!(chars, vec!['з', 'д', 'р', 'а', 'в', 'е', 'й']);
let index_to_char: HashMap<usize, char> = my_collect("здр".char_indices());
let mut expected = HashMap::new();
expected.insert(0, 'з');
expected.insert(2, 'д');
expected.insert(4, 'р');
assert_eq!(index_to_char, expected);
let digits: String = my_collect("1a2b3c4d".chars().filter(|c| c.is_digit(10)));
assert_eq!(digits, String::from("1234"));
}

Имаше очудване как работи метода collect на итераторите.
Най-добрия начин човек да го разбере е да го имплементира стъпка по стъпка.
Решате задачата без да използвате имплементацията в стандартната библиотека.

pub trait MyFromIterator<A> {
    fn my_from_iter<I>(iter: I) -> Self
    where
        I: Iterator<Item = A>;
}

Имплементирайте трейта за вектор, низ и хеш речник.
Добавете типови ограничения където се налага

// итератор по T -> Vec<T>
impl<???> MyFromIterator<???> for Vec<T> {
    // ...
}

// итератор по char -> String
impl<???> MyFromIterator<???> for String {
    // ...
}

// интератор по (K, V) -> HashMap<K, V>
impl<???> MyFromIterator<???> for HashMap<K, V> {
    // ...
}

Имплементирайте функция my_collect, използваща MyFromIterator.
Добавете необходимите типови ограничения, където трябва.

fn my_collect<I, C>(iter: I) -> C {
    todo!()
}

Функцията my_collect трябва да позволява конструиране на произволна колекция от произволен итератор, стига колекцията да имплементира MyFromIterator

let bytes: Vec<u8> = my_collect("hello".bytes());
let chars: Vec<char> = my_collect("hello".chars());
let index_to_char: HashMap<usize, char> = my_collect("hello".char_indices());
let digits: String = my_collect("1a2b3c4d".chars().filter(|c| c.is_digit(10)));

Задължително прочетете (или си припомнете): Указания за предаване на домашни

Погрижете се решението ви да се компилира с базовия тест:

// Include the solution source in the same file, so we
// don't have to worry about item visibility.
// Please don't use `include!` in real code, this is a hack
// around the checking system.
include!{ "../src/lib.rs" }
#[test]
fn test_basic() {
let bytes: Vec<u8> = my_collect("hello".bytes());
assert_eq!(bytes, vec![b'h', b'e', b'l', b'l', b'o']);
let chars: Vec<char> = my_collect("здравей".chars());
assert_eq!(chars, vec!['з', 'д', 'р', 'а', 'в', 'е', 'й']);
let index_to_char: HashMap<usize, char> = my_collect("здр".char_indices());
let mut expected = HashMap::new();
expected.insert(0, 'з');
expected.insert(2, 'д');
expected.insert(4, 'р');
assert_eq!(index_to_char, expected);
let digits: String = my_collect("1a2b3c4d".chars().filter(|c| c.is_digit(10)));
assert_eq!(digits, String::from("1234"));
}