Предоставьте HashMap универсальным способом, который игнорирует значение HashMap

Использовать аргумент dig.lab в функции cut:

a<-c(1,10,100,1000,100000,1000000)
b<-cut(a, 
breaks=data.frame(
  classIntervals(
    a,n=3,method="quantile")[2])[,1],
include.lowest=T,dig.lab=10) ##Number of digits used
b
[1] [1,70]          [1,70]          (70,34000]      (70,34000]     
[5] (34000,1000000] (34000,1000000]
Levels: [1,70] (70,34000] (34000,1000000]
1
задан Shepmaster 17 January 2019 в 15:24
поделиться

1 ответ

Со связанным типом

Приведенный ниже код с использованием универсального кода верен, но, подумав об этом, я думаю, что использование связанного типа может быть более подходящим здесь. Черта должна выглядеть следующим образом:

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
    }
}
0
ответ дан Shepmaster 17 January 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: