со связанным типом
Код ниже с использованием универсального кода верен, но, подумав об этом, я думаю, что использование связанного типа может быть более подходящим здесь. Черта должна выглядеть так:
pub trait HashMapContainer {
type Value;
fn get_hash_map(&self) -> &HashMap<String, Self::Value>;
fn get_hash_map_mut(&mut self) -> &mut HashMap<String, Self::Value>;
}
Разница в том, что теперь вы можете реализовать черту только один раз для структуры, а не несколько раз, что более правильно в этом случае.
Реализации примерно такие же, как с параметром универсального типа.
impl HashMapContainer for HashMapContainerImpl1 {
type Value = String;
fn get_hash_map(&self) -> &HashMap<String, Self::Value> {
&self.map
}
fn get_hash_map_mut(&mut self) -> &mut HashMap<String, Self::Value> {
&mut self.map
}
}
impl HashMapContainer for HashMapContainerImpl2 {
type Value = u8;
fn get_hash_map(&self) -> &HashMap<String, Self::Value> {
&self.map
}
fn get_hash_map_mut(&mut self) -> &mut HashMap<String, Self::Value> {
&mut self.map
}
}
( Детская площадка )
Вы также можете посмотреть на Когда уместно использовать ассоциированный тип вместо универсального типа? , который объясняет разницу между этими двумя довольно хорошими.
с универсальным типом
Это можно решить, введя универсальный тип в вашу черту HashMapContainer
.
pub trait HashMapContainer<T> {
fn get_hash_map(&self) -> &HashMap<String, T>;
fn get_hash_map_mut(&mut self) -> &mut HashMap<String, T>;
}
Я изменил подпись, чтобы вернуть ссылку на HashMap
. Было бы возможно сделать это без, например, используя clone
или принимая self
в качестве значения, а не в качестве ссылки. Я также представил _mut
версию.
Реализация является прямым предисловием:
impl HashMapContainer<String> for HashMapContainerImpl1 {
fn get_hash_map(&self) -> &HashMap<String, String> {
&self.map
}
fn get_hash_map_mut(&mut self) -> &mut HashMap<String, String> {
&mut self.map
}
}
impl HashMapContainer<u8> for HashMapContainerImpl2 {
fn get_hash_map(&self) -> &HashMap<String, u8> {
&self.map
}
fn get_hash_map_mut(&mut self) -> &mut HashMap<String, u8> {
&mut self.map
}
}