Как обобщить HashMap, переданный функции с различными типами ключей? - PullRequest
2 голосов
/ 09 марта 2020

У меня есть hm1: HashMap<K, V>, где K - это кортеж (k1, 2, k3), а V - это кортеж из 10 элементов, таких как (v1, v2, v3, /* ... */ v10).

У меня есть функция, которая действует на это HashMap, поэтому я передаю его в качестве параметра:

fn do_something(hm1: HashMap<(&i64, &i64, &Option<i64>), (&i64, &i64, /* ... */ &i64)>) -> () {
    //Access k1, k2, k3 and v1 .. v10 and do something with it
}

У меня есть второй HashMap hm2, где единственное отличие - это дополнительный ключевой элемент. hm2: HashMap<K, V>, где K - это кортеж (k1, k2, k3, k4), а V - снова кортеж из 10 элементов (v1, v2, v3, /* ... */ v10).

Я бы хотел избежать копирования, вставляющего ту же функцию do_something() с адаптированным подпись, потому что логика c внутри почти одинакова. Разница лишь в том, что у меня есть дополнительный элемент k4 в кортеже, к которому я бы тоже потом обратился, если бы у меня был hm2.

. Есть ли способ обобщить параметр HashMap<K, V>, чтобы я мог пройти оба HashMap с и действовать на них, не дублируя мою функцию?

1 Ответ

0 голосов
/ 09 марта 2020

Я бы хотел избежать копирования с использованием одной и той же функции do_something() с адаптированной подписью, потому что логика c внутри почти одинакова.

Копирование почти идентичного кода для Различные типы - это то, для чего предназначены дженерики Rust! Если значения имеют одинаковый тип в обоих случаях, и отличаются только ключи, вы можете абстрагироваться по ключам:

type Value<'a> = (&'a i64, &'a i64, /* ... */ &'a i64);

fn do_something<K>(hash_map: HashMap<K, Value<'_>>) {
    for value in hash_map.values() {
        // do something with the value
    }
}

Учитывая, что вы ничего не знаете о ключах внутри функции, вы не можете многое сделать с ними. В частности, вы не можете деструктурировать их для доступа к отдельным элементам кортежей ключей.

...